Ordenamiento por Inserción (Insertion Sort)
¿Qué es el ordenamiento por inserción?
El Insertion Sort es un algoritmo de ordenamiento simple y estable que construye la lista final una posición a la vez, insertando cada elemento en su lugar correcto dentro de la parte ya ordenada. Aunque su complejidad temporal promedio es O(n²), es extremadamente eficaz para colecciones pequeñas o casi ordenadas, y sirve como base para algoritmos más avanzados como TimSort (usado en Python y Java).
Cómo funciona paso a paso
- Se considera que el primer elemento está ordenado.
- Se toma el siguiente elemento (key) y se compara con los elementos de la sub‑lista ordenada, moviéndolos una posición a la derecha hasta encontrar la posición correcta.
- Se inserta key en esa posición.
- Se repite el proceso para todo el arreglo.
Este proceso es análogo a la forma en que la mayoría de la gente ordena cartas en la mano.
Análisis de complejidad
- Mejor caso (lista ya ordenada):
O(n)– solo se realizan comparaciones sin desplazamientos. - Peor caso (lista en orden inverso):
O(n²)– cada elemento se desplaza a lo largo de la lista. - Espacio adicional:
O(1)(in‑place). - Estabilidad: Sí, mantiene el orden relativo de elementos iguales.
Implementación en Python
def insertion_sort(arr):
"""Ordena la lista arr in‑place usando el algoritmo de inserción.
Retorna la lista ordenada para facilitar el encadenamiento.
"""
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
# Desplaza elementos mayores que key a la derecha
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
# Ejemplo de uso
if __name__ == "__main__":
datos = [34, 8, 64, 51, 32, 21]
print("Original:", datos)
print("Ordenado :", insertion_sort(datos.copy()))
El algoritmo es in‑place, lo que significa que no se crea una copia adicional del arreglo, lo que lo hace adecuado para entornos con memoria limitada.
Ejemplo paso a paso con salida en consola
def insertion_sort_debug(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
print(f"Iteración {i}: {arr}")
return arr
insertion_sort_debug([5, 2, 9, 1, 5, 6])
Salida esperada:
Iteración 1: [2, 5, 9, 1, 5, 6] Iteración 2: [2, 5, 9, 1, 5, 6] Iteración 3: [1, 2, 5, 9, 5, 6] Iteración 4: [1, 2, 5, 5, 9, 6] Iteración 5: [1, 2, 5, 5, 6, 9]
Comparativa rápida con otros algoritmos de sorting
Insertion Sort
- Complejidad media:
O(n²) - Mejor caso:
O(n)(lista casi ordenada) - Uso de memoria:
O(1) - Estable: Sí
- Ideal para: datasets < 10⁴ elementos, listas parcialmente ordenadas, inserciones en tiempo real.
Quicksort vs Merge Sort vs TimSort
- Quicksort:
O(n log n)promedio,O(n²)peor caso,O(log n)espacio recursivo, no estable. - Merge Sort:
O(n log n)siempre,O(n)espacio extra, estable. - TimSort (Python default): combina Insertion Sort y Merge Sort,
O(n)mejor caso,O(n log n)promedio,O(n)espacio extra, extremadamente rápido en datos reales.
Optimización y buenas prácticas
- Umbral híbrido: en algoritmos como Introsort o TimSort se usa Insertion Sort para sub‑arreglos menores a 32‑64 elementos, lo que reduce la sobrecarga de recursión.
- Uso de sentinela: colocar un valor sentinel (p. ej.,
-inf) al inicio del arreglo evita la comprobaciónj >= 0dentro del bucle interno, mejorando ligeramente el rendimiento. - Iteraciones en Cython o Numba: compilar la rutina con
@njitde Numba puede acelerar el algoritmo hasta 10× en listas de varios miles de elementos.
Casos de uso del mundo real
Aunque rara vez se elige como algoritmo principal en bases de datos de gran escala, Insertion Sort es valioso en:
- Ordenamiento de pequeñas colecciones de resultados en UI antes de enviarlos al servidor.
- Algoritmos de online sorting donde los datos llegan de forma incremental.
- Educación y entrevistas técnicas para ilustrar conceptos de complejidad y estabilidad.
Depuración y troubleshooting
Si el algoritmo parece no ordenar correctamente, verifica los siguientes puntos:
- Que la condición del bucle interno sea
arr[j] > keyy no>=(esto rompería la estabilidad). - Que el índice
jse decrementa correctamente y no se vuelve negativo antes de la asignación. - Que la lista se pasa por referencia y no se está trabajando sobre una copia inesperada.
Conclusión
Insertion Sort sigue siendo una herramienta didáctica esencial y, cuando se combina con técnicas híbridas, aporta velocidad en escenarios de small‑data y near‑sorted. Dominar su implementación en Python permite reconocer cuándo un algoritmo más complejo es innecesario y, a la vez, entender los cimientos de los sorters modernos como TimSort.
Ordenamiento por Inserción (Insertion Sort) – Conceptos, Implementación en Python y Comparativas