
Ordenar no es solo acomodar valores. El orden puede habilitar búsqueda binaria, agrupar registros, construir rankings o preparar una interfaz para que el usuario entienda los datos.
La decisión correcta no empieza por memorizar nombres. Empieza por cinco preguntas: cuánto mide la colección, cuánto orden previo tiene, si los empates deben conservarse, cuánta memoria puedes usar y qué propiedades tiene el dominio.
No elijas el algoritmo con la mejor fila aislada; elige el que sostiene las garantías que tu producto necesita.
01. Primero define qué significa “mejor”
Dos algoritmos con O(n log n) pueden comportarse de forma distinta. Uno puede ser estable, otro usar menos memoria y otro responder mejor a la localidad de caché. Antes de comparar nombres, fija el criterio dominante:
| Si necesitas principalmente… | Primera opción para estudiar | Razón |
|---|---|---|
| una lista pequeña o casi ordenada | Insertion Sort | aprovecha el orden existente y tiene poco overhead |
| estabilidad predecible | Merge Sort | conserva el orden relativo de los empates |
| buen rendimiento general en memoria | Quick Sort bien implementado | particiona in-place y suele tener buena localidad |
peor caso O(n log n) con poco espacio auxiliar | Heap Sort | mantiene una garantía defensiva |
| enteros en un rango pequeño | Counting Sort | usa el dominio en lugar de comparar cada par |
| claves separables en dígitos o segmentos | Radix Sort | procesa la clave por posiciones |
Flujo de decisión para elegir un algoritmo de ordenamiento según las restricciones de los datos
Estabilidad significa que dos registros con la misma clave conservan su orden relativo. Si primero ordenas personas por nombre y después, con un método estable, por equipo, los nombres seguirán ordenados dentro de cada equipo. Esa garantía importa en tablas, reportes y ordenamientos encadenados.
Comparación visual entre un ordenamiento estable y uno inestable
También importa si el algoritmo es adaptativo: Insertion Sort se acerca a O(n) cuando la lista ya está casi ordenada porque realiza pocos desplazamientos. Un algoritmo no adaptativo no obtiene automáticamente esa ventaja.
02. La tabla que realmente debes leer
Los algoritmos basados solo en comparaciones tienen un límite: en el caso general necesitan al menos Ω(n log n) comparaciones. Por eso Merge, Quick y Heap Sort convergen alrededor de esa escala. Counting y Radix pueden superarla porque usan información adicional sobre el dominio.
| Método | Mejor | Promedio | Peor | Espacio auxiliar | Estable |
|---|---|---|---|---|---|
| Insertion Sort | O(n) | O(n²) | O(n²) | O(1) | sí |
| Merge Sort | O(n log n) | O(n log n) | O(n log n) | O(n) | sí |
| Quick Sort | O(n log n) | O(n log n) | O(n²) | O(log n) esperado por recursión | no, normalmente |
| Heap Sort | O(n log n) | O(n log n) | O(n log n) | O(1) | no |
| Counting Sort | O(n + k) | O(n + k) | O(n + k) | O(n + k) en versión estable | puede serlo |
| Radix Sort | O(d(n + k)) | O(d(n + k)) | O(d(n + k)) | depende del método por dígito | sí, con pasos estables |
Aquí k es el rango o número de buckets y d la cantidad de posiciones procesadas. Esos parámetros evitan llamar “lineal” a un algoritmo sin explicar de qué depende.
Big O tampoco describe constantes, acceso a memoria, costo del comparador ni asignaciones. Una tabla te da el mapa; una medición con datos representativos decide el camino.
03. Métodos simples: aprende con Bubble, trabaja con Insertion
Bubble, Selection e Insertion Sort comparten un peor caso cuadrático, pero no ofrecen lo mismo:
- Bubble Sort hace visibles los intercambios entre vecinos. Es pedagógico, no una opción general de producción.
- Selection Sort realiza pocos swaps —como máximo uno por posición—, pero siempre busca el siguiente mínimo y no suele ser estable.
- Insertion Sort desplaza una zona ordenada y aprovecha listas pequeñas o casi ordenadas. Por eso aparece como componente de algoritmos híbridos.
Una implementación directa deja visible su ventaja adaptativa:
function insertionSort(values: number[]) {
for (let i = 1; i < values.length; i += 1) {
const current = values[i];
let j = i - 1;
while (j >= 0 && values[j] > current) {
values[j + 1] = values[j];
j -= 1;
}
values[j + 1] = current;
}
return values;
}Si cada elemento ya está cerca de su posición, el while trabaja poco. Si la lista llega en orden inverso, los desplazamientos crecen hasta O(n²).
04. Merge, Quick y Heap: el mismo orden, tradeoffs distintos
Los tres pertenecen al mundo general de O(n log n), pero resuelven prioridades diferentes.
Merge Sort: estabilidad y previsibilidad
Divide, ordena cada mitad y mezcla resultados. Su tiempo no depende de encontrar un buen pivote y es naturalmente estable si, ante un empate, toma primero el elemento de la izquierda. El costo habitual es un buffer auxiliar O(n) para arrays.
También encaja bien con listas enlazadas y ordenamiento externo, donde los datos no caben completos en memoria y se mezclan bloques desde almacenamiento.
Quick Sort: partición y buen comportamiento promedio
Elige un pivote, separa menores y mayores y repite sobre cada partición. Sus ventajas prácticas vienen de la localidad de memoria y el bajo overhead, no de una garantía absoluta. Un pivote sistemáticamente malo puede producir particiones 0 y n - 1, llevando el tiempo a O(n²) y profundizando la recursión.
Aleatorizar el pivote, usar median-of-three o cambiar a otro método cuando la recursión crece reduce ese riesgo. Una implementación industrial suele ser híbrida; no asumas que la función estándar de un lenguaje usa Quick Sort puro.
Heap Sort: una garantía defensiva
Convierte el array en un heap y extrae repetidamente el máximo o mínimo. Mantiene O(n log n) incluso en el peor caso y puede trabajar con O(1) espacio auxiliar. A cambio, no es estable y suele tener peor localidad de memoria que Quick Sort.
La decisión resumida es: Merge para estabilidad, Quick para buen promedio práctico y Heap cuando la garantía de peor caso y el espacio controlado pesan más.
Comparación visual de las mecánicas de Merge Sort, Quick Sort y Heap Sort
05. Cuando el dominio permite dejar de comparar
Counting, Radix y Bucket Sort no son reemplazos universales. Funcionan porque conocen algo que los métodos por comparación no conocen.
| Método | Supuesto que aprovecha | Costo relevante | Señal de peligro |
|---|---|---|---|
| Counting Sort | claves enteras entre 0 y k | O(n + k) | k es enorme frente a n |
| Radix Sort | claves con d posiciones | O(d(n + k)) | dígitos variables o paso interno inestable |
| Bucket Sort | distribución razonablemente uniforme | promedio cercano a O(n + k) | un bucket concentra casi todos los datos |
Comparación técnica de Counting Sort, Radix Sort y Bucket Sort
Ordenar diez millones de edades entre 0 y 120 es un escenario razonable para Counting Sort. Ordenar diez millones de IDs dispersos entre 0 y 10¹⁵ no lo es: el rango destruiría la ventaja de memoria.
Radix Sort necesita que cada pasada por dígito sea estable para conservar el trabajo anterior. Bucket Sort necesita además una estrategia para ordenar dentro de cada bucket; su rendimiento depende de la distribución, no solo de la cantidad de elementos.
06. Decisión práctica y realidad de JavaScript
En un producto, empieza por la implementación estándar del lenguaje. Suele estar probada, optimizada y combinar estrategias según el tamaño o la forma de la entrada. Cambia de enfoque cuando una garantía o una medición lo justifique.
En JavaScript moderno:
const users = [
{ name: "Ana", score: 20 },
{ name: "Luis", score: 10 },
{ name: "Mara", score: 20 },
];
const ranked = users.toSorted((a, b) => b.score - a.score);sort() modifica el array original; toSorted() devuelve una copia. Ambos necesitan un comparador para ordenar números u objetos con la intención correcta. El ordenamiento estándar es estable, por lo que Ana permanece antes que Mara cuando comparten puntuación.
Antes de implementar tu propio algoritmo, responde:
- ¿La colección es pequeña, grande o casi ordenada?
- ¿Los empates deben conservar su orden?
- ¿Importa más el promedio, el peor caso o la memoria?
- ¿El dominio tiene un rango o formato aprovechable?
- ¿Ordenas una vez o repites la operación en una ruta crítica?
- ¿Tus datos reales confirman la ventaja esperada?
Para aprender, implementa Insertion, Merge y Quick Sort. Para producción, usa primero la herramienta estándar y mide. Para restricciones especiales, elige la familia cuya garantía coincide con el problema, no la que tenga el nombre más sofisticado.