Ordenamiento 2: mezcla y quicksort
Ordenar un millón de valores comparando todos los pares lleva unos 500 mil millones de comparaciones; el ordenamiento por mezcla necesita unos 20 millones.
Dividir el problema, resolver las mitades
Los métodos de la unidad anterior trabajan con toda la lista a la vez y lo pagan con unas n² comparaciones. Los dos métodos de esta unidad siguen otro plan, llamado divide y vencerás. Se divide la lista en partes más pequeñas, se ordena cada parte con el mismo método y luego se combinan las partes ordenadas. La división sigue hasta que una parte tiene un valor o ninguno, y una lista de un valor ya está ordenada. Como el método se llama a sí mismo con listas más pequeñas, es recursivo (la unidad 6 estudia la recursión en detalle).
Ordenamiento por mezcla: el trabajo está en la mezcla
El ordenamiento por mezcla (merge sort) corta la lista por la mitad, ordena la mitad izquierda, ordena la mitad derecha y mezcla las dos mitades ordenadas en una. Lo ingenioso es la mezcla. Dos listas ordenadas se pueden combinar mirando solo sus valores del frente. Compara los dos del frente, anota el menor y pasa al siguiente. Repite hasta que una lista quede vacía, y luego copia lo que quede de la otra. Mezclar [1, 4, 7] y [2, 3, 8] da 1 (1 contra 2), 2 (4 contra 2), 3 (4 contra 3), 4 (4 contra 8), 7 (7 contra 8), y luego se copia el 8: 5 comparaciones para 6 valores. Una mezcla de dos listas con n valores en total nunca necesita más de n − 1 comparaciones.
function merge(left, right) {
const out = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (right[j] < left[i]) out.push(right[j++]);
else out.push(left[i++]);
}
return out.concat(left.slice(i), right.slice(j));
}
function mergeSort(a) {
if (a.length <= 1) return a; // ya está ordenada
const mid = Math.floor(a.length / 2);
return merge(mergeSort(a.slice(0, mid)), mergeSort(a.slice(mid)));
}¿Por qué es rápido? Imagina la división por mitades como niveles. Una lista de 8 valores se divide en 2 listas de 4, luego en 4 listas de 2 y luego en 8 listas de 1: tres niveles, porque 8 se puede partir por la mitad 3 veces. En cada nivel, todas las mezclas juntas tocan cada valor una vez, así que un nivel cuesta como mucho unas n comparaciones. Con log₂ n niveles, el total es de unas n log₂ n. Para un millón de valores son unos 20 millones de comparaciones, contra unos 500 mil millones de los métodos de par en par. Dividida como [38, 27, 43, 3] y [9, 82, 10], como en el laboratorio, la lista [38, 27, 43, 3, 9, 82, 10] lleva 14 comparaciones; el código de arriba la divide en 3 y 4 y lleva 13.
El precio es la memoria. La mezcla necesita un lugar donde escribir el resultado, así que el ordenamiento por mezcla usa una segunda lista tan grande como la entrada. Además, el ordenamiento por mezcla es estable: los valores que se comparan como iguales conservan su orden original, porque la mezcla toma de la lista izquierda cuando los del frente son iguales. Eso importa cuando ordenas una tabla por una columna y luego por otra, por ejemplo por ciudad y luego por nombre.
Arrastra para girar. Desplaza o pellizca para acercar.
Quicksort: dividir alrededor de un pivote
El quicksort divide la lista de otra manera. Elige un valor, el pivote, y reacomoda la lista para que todo lo menor que el pivote quede antes que él y todo lo demás después. Este paso se llama partición. Ahora el pivote está en su lugar final, y los dos lados se pueden ordenar por separado con el mismo método. Después no hace falta mezclar nada, porque cada valor de la izquierda ya es menor que cada valor de la derecha.
El laboratorio usa una versión común de los libros de texto que toma como pivote el último valor de cada parte. Con [5, 1, 4, 2, 8], el pivote 8 se compara con los otros cuatro valores, todos menores, así que el 8 se queda al final. La parte siguiente, [5, 1, 4, 2], usa el pivote 2: solo el 1 es menor, así que después de dos intercambios la lista es [1, 2, 4, 5, 8]. Una comparación más resuelve [4, 5]. Total: 8 comparaciones y 2 intercambios.
Cuando el pivote cae cerca del medio, cada división parte el problema por la mitad y el quicksort lleva unas n log₂ n comparaciones, como el ordenamiento por mezcla. Además trabaja dentro de la lista original, sin una segunda copia. Pero un mal pivote hace daño. Si la lista ya está ordenada y el pivote es siempre el último valor, cada división separa un solo valor, y el quicksort vuelve a unas n²/2 comparaciones: 10 para [1, 2, 3, 4, 5], igual que el ordenamiento por selección. Las bibliotecas reales lo evitan eligiendo el pivote con más cuidado, por ejemplo al azar o como el del medio de tres valores de muestra.
| Método | Comparaciones | Memoria extra |
|---|---|---|
| Ordenamiento por inserción | lo habitual, unas n²/4; el peor caso, unas n²/2 | ninguna; estable |
| Ordenamiento por mezcla | unas n log₂ n, siempre | una segunda lista de n valores; estable |
| Quicksort | lo habitual, unas n log₂ n; el peor caso, unas n²/2 (malos pivotes) | poca; las versiones habituales no son estables |
| divide y vencerás | Dividir un problema, resolver las partes de la misma manera y combinar los resultados |
| mezcla | Combinar dos listas ordenadas tomando una y otra vez el menor de los del frente |
| ordenamiento por mezcla | Partir por la mitad, ordenar cada mitad, mezclar: unas n log₂ n comparaciones |
| pivote | El valor alrededor del cual el quicksort divide la lista |
| partición | Reacomodar la lista para que los valores menores queden antes del pivote y el resto después |
| quicksort | Partir alrededor de un pivote y luego ordenar cada lado |
| ordenamiento estable | Los valores iguales conservan su orden original |
| in situ (in place) | Ordena dentro de la lista original con poca memoria extra |
- ¿Cuántas comparaciones lleva mezclar [1, 4, 7] y [2, 3, 8]?
- ¿Cuántas comparaciones lleva mezclar [1, 2, 3] y [4, 5, 6]?
- Una lista de 16 valores se parte por la mitad hasta que cada parte tiene un valor. ¿Cuántos niveles de división hay?
- ¿Más o menos cuántas comparaciones hace el ordenamiento por mezcla con un millón de valores?
- unas 20
- unos 20 millones
- unos 500 mil millones
- exactamente un millón
- Después de la partición, ¿dónde está el pivote?
- En su posición final ordenada
- Al principio
- Al final
- En cualquier lugar; vuelve a moverse después
- El quicksort con el último valor como pivote se ejecuta sobre la lista ya ordenada [1, 2, 3, 4, 5]. ¿Cuántas comparaciones hace?
- ¿Qué método necesita una segunda lista tan grande como la entrada?
- Ordenamiento por mezcla
- Quicksort
- Ordenamiento por inserción
- ¿Quién propuso el ordenamiento por mezcla en 1945?
- Tony Hoare
- John von Neumann
- Ada Lovelace
- Euclides
- ¿Qué problema llevó a Tony Hoare al quicksort?
- Ordenar las palabras de una oración para un diccionario en cinta magnética
- Ordenar los libros de una biblioteca
- Clasificar páginas web
- Ordenar cheques bancarios
- ¿Por qué se dice que el ordenamiento por mezcla es estable?
- Los valores iguales conservan su orden original
- Nunca falla
- Siempre tarda lo mismo
- No usa memoria extra
- ¿Cuál es el menor número posible de comparaciones en el peor caso para cualquier ordenamiento por comparación de 10 valores (log₂ 10!, redondeado hacia arriba)?
- Divide y vencerás: dividir, resolver las partes, combinar.
- Ordenamiento por mezcla: siempre unas n log₂ n comparaciones, necesita memoria extra, estable.
- Quicksort: partir alrededor de un pivote; rápido en promedio, unas n²/2 con malos pivotes.
- Un millón de valores: unos 20 millones de comparaciones en lugar de 500 mil millones.
- Ningún ordenamiento por comparación puede superar unas n log₂ n en el peor caso.
Fuentes de este curso (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Fecha de consulta: 2026-10-17