8 - Proyecto final del tutorial

Integraremos Bubble, Insertion y Selection Sort en un solo proyecto para comparar resultados. El menú permite elegir el algoritmo, ordenar listas de prueba, medir tiempos y observar el antes y después en Python.

8.1 Implementar Bubble, Insertion y Selection en un archivo

En este tutorial vamos a concentrar todo en un único archivo para facilitar la ejecución. Cada algoritmo estará en su propia función y compartiremos helpers como swap e imprimir_lista.

Un menú simple por consola es suficiente: lee la opción del usuario (b, i, s) y llama al algoritmo correspondiente. Evita repetir código usando una función que reciba la función de ordenamiento.

8.3 Ordenar listas de prueba

Usa varios conjuntos: aleatorio, casi ordenado e inverso. Copia la lista original antes de ordenar para poder comparar resultados sin perder los datos iniciales.

8.4 Comparar tiempos de ejecución

Para entradas pequeñas, time.perf_counter() es suficiente. Si necesitas más precisión, ejecuta varias corridas y promedia, pero recuerda que los algoritmos son O(n^2) y en listas grandes el tiempo crecerá rápido.

8.5 Imprimir resultados antes y después

Con imprimir_lista muestra el estado inicial y el final. En listas grandes, imprime solo los primeros y últimos elementos o la longitud para no saturar la salida.

8.6 Probar paso a paso

Coloca breakpoints en los bucles internos para seguir las comparaciones y swaps. Ejecuta el menú varias veces con diferentes entradas para verificar que cada algoritmo produce el mismo resultado ordenado.

8.7 Comparar resultados con listas de distintos tamaños

Corre el programa con n=10, n=100 y n=500 para ver cómo crecen los tiempos. Anota comparaciones y swaps si quieres construir una tabla similar a la del tema 6.

8.8 Código completo en un solo archivo

Guarda este script como ordenamientos.py y ejecútalo desde la terminal o tu editor.

import random
import time

def swap(valores, i, j):
  valores[i], valores[j] = valores[j], valores[i]

def imprimir_lista(valores):
  for valor in valores:
    print(valor, end=", ")

def bubble_sort(valores):
  n = len(valores)
  for i in range(n - 1):
    hubo_intercambio = False
    limite = n - 1 - i
    for j in range(limite):
      if valores[j] > valores[j + 1]:
        swap(valores, j, j + 1)
        hubo_intercambio = True
    if not hubo_intercambio:
      break

def insertion_sort(valores):
  for i in range(1, len(valores)):
    actual = valores[i]
    j = i - 1
    while j >= 0 and valores[j] > actual:
      valores[j + 1] = valores[j]
      j -= 1
    valores[j + 1] = actual

def selection_sort(valores):
  for i in range(len(valores) - 1):
    indice_min = i
    for j in range(i + 1, len(valores)):
      if valores[j] < valores[indice_min]:
        indice_min = j
    if indice_min != i:
      swap(valores, i, indice_min)

def ejecutar(nombre, funcion, valores):
  inicio = time.perf_counter()
  funcion(valores)
  fin = time.perf_counter()
  ms = (fin - inicio) * 1000
  print(f"{nombre} -> tiempo: {ms:.3f} ms")

def main():
  max_valores = 1000
  try:
    n = int(input(f"Ingrese cantidad de elementos (max {max_valores}): "))
  except ValueError:
    print("Tamano no valido.")
    return

  if n <= 0 or n > max_valores:
    print("Tamano no valido.")
    return

  original = [random.randint(0, 999) for _ in range(n)]
  print("Antes: ", end="")
  imprimir_lista(original)
  print()

  opcion = input("Seleccione algoritmo (b)ubble, (i)nsertion, (s)election: ").strip().lower()
  trabajo = list(original)

  if opcion == "b":
    ejecutar("Bubble Sort", bubble_sort, trabajo)
  elif opcion == "i":
    ejecutar("Insertion Sort", insertion_sort, trabajo)
  elif opcion == "s":
    ejecutar("Selection Sort", selection_sort, trabajo)
  else:
    print("Opcion no reconocida.")
    return

  print("Despues: ", end="")
  imprimir_lista(trabajo)
  print()

if __name__ == "__main__":
  main()
Proyecto final: menu y ejecucion de los ordenamientos