En esta primera lección introducimos el enfoque de ordenamientos eficientes: algoritmos que escalan mejor que las alternativas cuadráticas. Todos los ejemplos pueden compilarse en C 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 C luce así:
void mergesort(int *valores, int inicio, int fin) {
if (inicio >= fin) {
return;
}
int 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.