En esta primera lección introducimos el enfoque de ordenamientos eficientes: algoritmos que escalan mejor que las alternativas cuadráticas. Todos los ejemplos pueden ejecutarse en Python y sirven como base para las implementaciones que veremos a lo largo del tutorial.
Algoritmos como Bubble Sort, Insertion Sort o Selection Sort repiten comparaciones de forma doblemente anidada. El costo O(n^2) crece rápido:
n = 10 000 elementos, un método cuadrático realiza en el orden de 100 millones de comparaciones.Por eso necesitamos algoritmos que reduzcan el número de comparaciones y mejoren el acceso a memoria.
La mayoría de los ordenamientos eficientes basados en comparación alcanzan O(n log n). Esto significa que al duplicar n el trabajo crece un poco más que linealmente, pero muy por debajo de n^2. Por ejemplo:
n = 10 000, n log n ronda 132 000, frente a 100 millones de un algoritmo cuadrático.Es una estrategia en la que partimos el problema en porciones más pequeñas, resolvemos cada una y luego combinamos los resultados. Merge Sort y Quick Sort son ejemplos clásicos. Un esqueleto típico en Python luce así:
def mergesort(valores, inicio, fin):
if inicio >= fin:
return
medio = (inicio + fin) // 2
mergesort(valores, inicio, medio)
mergesort(valores, medio + 1, fin)
merge(valores, inicio, medio, fin) # combina dos mitades ordenadas
La recursión genera el factor log n (altura del árbol de llamadas), y el trabajo lineal al mezclar produce el factor n.
No todos los datos caben en memoria. Distinguimos:
Elegir bien el ordenamiento impacta directamente en productos y servicios:
Con este contexto, el resto del curso se centra en algoritmos O(n log n) y en las técnicas para ajustarlos a distintos escenarios.