Algoritmos de ordenación
Python ya ofrece la función sorted() y el método .sort() para ordenar una lista sin escribir ni una línea de lógica de ordenación. Pero entender cómo ordenan realmente esas herramientas es un ejercicio clásico de pensamiento algorítmico: obliga a razonar sobre comparaciones, intercambios y recorridos de una lista, y sienta las bases para entender la eficiencia de un algoritmo (algo que se retomará más adelante en el curso).
A continuación se explican cinco de los algoritmos de ordenación clásicos más conocidos.
Bubble Sort
Bubble Sort (ordenamiento de burbuja) es un algoritmo muy simple que funciona comparando elementos adyacentes y cambiándolos de posición si están en el orden incorrecto.
- Repite este proceso varias veces hasta que toda la lista esté ordenada.
- Se llama "burbuja" porque los valores más grandes "suben" poco a poco hacia el final de la lista, como burbujas en el agua.
Bubble Sort es fácil de entender, pero no es eficiente para listas grandes, porque compara muchos elementos varias veces.
Paso a paso con un ejemplo
Lista inicial
[5, 2, 9, 1, 5]
Primera pasada (comparar y mover burbujas)
- Comparar 5 y 2 → 5 > 2 → intercambiamos →
[2, 5, 9, 1, 5] - Comparar 5 y 9 → 5 < 9 → no cambiamos →
[2, 5, 9, 1, 5] - Comparar 9 y 1 → 9 > 1 → intercambiamos →
[2, 5, 1, 9, 5] - Comparar 9 y 5 → 9 > 5 → intercambiamos →
[2, 5, 1, 5, 9]
El número más grande 9 ya está en su posición final.
Segunda pasada
- Comparar 2 y 5 → no cambiamos →
[2, 5, 1, 5, 9] - Comparar 5 y 1 → 5 > 1 → intercambiamos →
[2, 1, 5, 5, 9] - Comparar 5 y 5 → no cambiamos →
[2, 1, 5, 5, 9]
Ahora el segundo número más grande 5 ya está en su lugar.
Tercera pasada
- Comparar 2 y 1 → 2 > 1 → intercambiamos →
[1, 2, 5, 5, 9] - Comparar 2 y 5 → no cambiamos →
[1, 2, 5, 5, 9]
Cuarta pasada
No hay cambios → la lista ya está ordenada:
[1, 2, 5, 5, 9]
Resumen visual del proceso
[5, 2, 9, 1, 5]
→ [2, 5, 9, 1, 5]
→ [2, 5, 1, 9, 5]
→ [2, 5, 1, 5, 9] # 9 en su lugar
→ [2, 1, 5, 5, 9] # 5 en su lugar
→ [1, 2, 5, 5, 9] # lista ordenada
Insertion Sort
Insertion Sort (ordenamiento por inserción) es un algoritmo que construye la lista ordenada de izquierda a derecha, insertando cada elemento en su posición correcta dentro de la parte ya ordenada.
Imagina que estás ordenando cartas en tu mano: tomas una carta a la vez y la colocas en el lugar correcto.
Insertion Sort es muy eficiente para listas pequeñas o casi ordenadas, y es fácil de implementar a mano.
Paso a paso con un ejemplo
Lista inicial
[8, 3, 5, 1, 4]
Paso 1: Considerar el primer elemento como ordenado
[8]→ ya está ordenado- Lista completa:
[8, 3, 5, 1, 4]
Paso 2: Insertar el segundo elemento 3
- Comparar
3con8→ 3 < 8 → mover8a la derecha - Insertar
3en la posición correcta →[3, 8, 5, 1, 4]
Paso 3: Insertar el tercer elemento 5
- Comparar
5con8→ 5 < 8 → mover8 - Comparar
5con3→ 5 > 3 → insertar5→[3, 5, 8, 1, 4]
Paso 4: Insertar el cuarto elemento 1
- Comparar
1con8→ mover8 - Comparar
1con5→ mover5 - Comparar
1con3→ mover3 - Insertar
1→[1, 3, 5, 8, 4]
Paso 5: Insertar el quinto elemento 4
- Comparar
4con8→ mover8 - Comparar
4con5→ mover5 - Comparar
4con3→ 4 > 3 → insertar4→[1, 3, 4, 5, 8]
Resultado final
[1, 3, 4, 5, 8]
Resumen visual
[8, 3, 5, 1, 4] # inicial
[3, 8, 5, 1, 4] # insertar 3
[3, 5, 8, 1, 4] # insertar 5
[1, 3, 5, 8, 4] # insertar 1
[1, 3, 4, 5, 8] # insertar 4
Selection Sort
Selection Sort (ordenamiento por selección) es un algoritmo simple de ordenación que funciona seleccionando el elemento más pequeño (o más grande, según el orden deseado) de la lista y colocándolo en su posición correcta, uno a uno, hasta ordenar toda la lista.
- No necesita listas adicionales; se hace in-place.
- Se basa en encontrar repetidamente el mínimo de la parte no ordenada y colocarlo en el siguiente lugar disponible de la parte ordenada.
Algoritmo
- Considerar la lista completa como no ordenada.
- Buscar el elemento mínimo dentro de la lista no ordenada.
- Intercambiar ese mínimo con el primer elemento de la lista no ordenada.
- Ahora la primera posición está ordenada.
- Repetir el proceso para el resto de la lista (excluyendo las posiciones ya ordenadas):
- Buscar el mínimo en la sublista restante.
- Colocarlo en la siguiente posición correcta.
- Continuar hasta que todas las posiciones estén ordenadas.
Cómo se organiza la lista internamente
- La lista se divide mentalmente en dos partes:
- La sublista ordenada al inicio.
- La sublista no ordenada al final.
- En cada iteración, el tamaño de la sublista ordenada aumenta en uno, y la sublista no ordenada disminuye en uno.
- Después de tantas iteraciones como elementos tenga la lista, toda la lista estará ordenada.
Características clave
- Siempre hace n-1 iteraciones si la lista tiene n elementos.
- Es un algoritmo determinista y estable si se implementa cuidadosamente.
- Fácil de entender y de implementar, pero no es eficiente para listas grandes, porque siempre busca el mínimo de manera completa en cada paso.
Paso a paso con un ejemplo
Lista inicial
[8, 3, 5, 1, 4]
Paso 1: Buscar el mínimo en toda la lista [8, 3, 5, 1, 4]
- Mínimo = 1 → intercambiar con el primer elemento
8 - Lista ahora:
[1, 3, 5, 8, 4]
Paso 2: Buscar el mínimo en la sublista [3, 5, 8, 4]
- Mínimo = 3 → ya está en la posición correcta
- Lista ahora:
[1, 3, 5, 8, 4]
Paso 3: Buscar el mínimo en [5, 8, 4]
- Mínimo = 4 → intercambiar con el primer elemento de la sublista
5 - Lista ahora:
[1, 3, 4, 8, 5]
Paso 4: Buscar el mínimo en [8, 5]
- Mínimo = 5 → intercambiar con
8 - Lista ahora:
[1, 3, 4, 5, 8]
Paso 5: Solo queda [8] → ya está ordenado
Resultado final
[1, 3, 4, 5, 8]
Merge Sort
Merge Sort es otro algoritmo de ordenación basado en la estrategia divide y vencerás. Merge Sort siempre divide primero y combina después, a diferencia de Quick Sort que elige un pivote y organiza alrededor de él.
La idea básica es:
- Dividir la lista en mitades hasta que cada sublista tenga un solo elemento (o esté vacía).
- Combinar (merge) esas sublistas de manera que queden ordenadas.
- Repetir el proceso hasta reconstruir la lista completa, ya ordenada.
Paso a paso con un ejemplo
Supongamos que queremos ordenar esta lista:
[8, 3, 1, 7, 0, 10, 2]
Paso 1: Dividir la lista
Dividimos la lista en dos mitades:
Izquierda: [8, 3, 1]
Derecha: [7, 0, 10, 2]
Paso 2: Dividir de nuevo hasta sublistas de un elemento
- Izquierda
[8, 3, 1]→[8]y[3, 1]→[3]y[1] - Derecha
[7, 0, 10, 2]→[7, 0]y[10, 2]→[7]y[0],[10]y[2]
Ahora cada sublista tiene un solo elemento, que por definición ya está ordenada.
Paso 3: Combinar sublistas ordenadas
Combinar [3] y [1]:
[1, 3]
Combinar [8] y [1, 3]:
[1, 3, 8]
Combinar sublistas de la derecha:
[7]y[0]→[0, 7][10]y[2]→[2, 10]- Combinar
[0, 7]y[2, 10]→[0, 2, 7, 10]
Paso 4: Combinar las mitades finales
Combinar [1, 3, 8] y [0, 2, 7, 10]:
[0, 1, 2, 3, 7, 8, 10]
Ahora la lista completa está ordenada.
Resumen visual del proceso
[8, 3, 1, 7, 0, 10, 2]
→ [8, 3, 1] y [7, 0, 10, 2]
→ [8], [3,1] y [7,0], [10,2]
→ [8], [3],[1] y [7],[0],[10],[2]
→ Combinar: [1,3], [8] → [1,3,8]
→ Combinar: [0,7], [2,10] → [0,2,7,10]
→ Combinar finales → [0,1,2,3,7,8,10]
Quick Sort
Quick Sort es un algoritmo de ordenación rápido que utiliza la estrategia divide y vencerás.
La idea básica es:
- Elegir un pivote (un elemento de la lista).
- Reorganizar los demás elementos para que los menores que el pivote queden a su izquierda y los mayores a su derecha.
- Aplicar el mismo proceso recursivamente a las sublistas de izquierda y derecha hasta que toda la lista esté ordenada.
Paso a paso con un ejemplo
Supongamos que queremos ordenar esta lista de menor a mayor:
[8, 3, 1, 7, 0, 10, 2]
Paso 1: Elegir un pivote
Elegimos, por ejemplo, el primer elemento: 8.
Paso 2: Reorganizar según el pivote Movemos todos los números menores que 8 a la izquierda y los mayores a la derecha:
[3, 1, 7, 0, 2, 8, 10]
Ahora 8 está en su posición correcta.
Paso 3: Aplicar Quick Sort a las sublistas
- Sublista izquierda:
[3, 1, 7, 0, 2] - Sublista derecha:
[10](ya está ordenada, solo tiene un elemento)
Ordenando la sublista izquierda [3, 1, 7, 0, 2]
Elegimos pivote 3.
Colocamos menores a la izquierda y mayores a la derecha:
[1, 0, 2, 3, 7]
3ya está en su posición correcta.- Sublista izquierda:
[1, 0, 2] - Sublista derecha:
[7](ya ordenada)
Ordenando [1, 0, 2]
Pivote 1.
Reorganizamos:
[0, 1, 2]
1queda en su lugar.- Sublistas
[0]y[2]ya están ordenadas.
Paso 4: Juntando todas las sublistas
[0, 1, 2, 3, 7, 8, 10]
Todos los elementos están ordenados.
Resumen visual del proceso
[8, 3, 1, 7, 0, 10, 2]
pivote 8 → [3,1,7,0,2] 8 [10]
pivote 3 → [1,0,2] 3 [7]
pivote 1 → [0] 1 [2]
Resultado final: [0,1,2,3,7,8,10]