seegongsik
Algoritmos

Cómo funciona merge sort

La vez pasada ordenamos una fila comparando vecinos y mandando atrás al mayor. Funciona, pero cuando la fila es larga resulta demasiado lento, porque cuantas más cartas hay, más comparaciones se acumulan. ¿Hay una forma más lista? Sí: partir la fila por la mitad.

01

De uno en uno es lento

El método anterior tenía la ventaja de ser simple: comparar vecinos y mandar atrás al mayor.
Pero cuando la fila crece, hay demasiado que comparar.
Si se duplican las cartas, las comparaciones se multiplican por cuatro. Con cuatro es rápido, pero con treinta y dos parece no terminar nunca.

largo de la fila4
comparaciones una por una6
Cada vez que la fila se duplica, las comparaciones saltan al cuádruple. Ordenar una por una se vuelve pesado rápido cuando la fila crece.

Duplica la fila. Doble de largo → cuatro veces más comparaciones.

Las barras suben de forma alarmante.
Cuanto más larga la fila, peor es la lentitud.
El problema es tratar la fila entera como un solo bloque y comparar hasta el final.
Entonces, ¿y si partimos el bloque?

02

Partir por la mitad

En lugar de manejar la fila larga entera, pártela por la mitad.
Parte cada mitad otra vez, y otra, y al final solo quedan casillas sueltas.
Y una casilla sola ya está ordenada, porque está sola y no tiene con quién compararse.

5
2
8
1
9
4
7
3
grupos1
Haz clic para seguir partiendo un grupo por la mitad. Cuanto más partes, más pequeños y numerosos los grupos.

Sigue partiendo un grupo por la mitad. 8 → 4+4 → 2+2+2+2 → una casilla cada uno.

¿Termina todo con partir?
No. Lo que se parte hay que volver a juntarlo en una fila: se emparejan las casillas sueltas y se combinan, y luego se combinan otra vez esos grupos.
Y combinar dos grupos ya ordenados resulta sorprendentemente fácil.

03

Combinar dos grupos ordenados

El secreto para combinar dos grupos ordenados en una fila es mirar solo el principio.
Se compara la primera casilla de cada grupo y se deja caer la menor en el resultado. La siguiente casilla ocupa su lugar y se vuelven a comparar las primeras.
Se van encajando de una en una, como una cremallera que se cierra.

grupo izquierdo (ordenado)
2
4
7
grupo derecho (ordenado)
1
5
8
fila fusionada
—
Compara solo los frentes de los dos grupos, y suelta el menor al resultado. Cada grupo ya está ordenado, así que solo miras el frente.

Compara el principio de los dos grupos y deja caer el menor. Se combina casilla a casilla, como una cremallera.

¿No es curioso? Comparar toda la fila revuelta era lento, pero combinar dos grupos ya ordenados es rápido, porque solo hay que mirar el principio.
Partir crea trozos pequeños y ordenados, y al combinarlos paso a paso pronto se obtiene una fila completa.

04

Por qué es rápido: el número de niveles

¿Por qué esto es más rápido?
Como se parte por la mitad, no hay muchos niveles de partición. Aunque la fila se duplique, los niveles solo aumentan en uno.
Combinar un nivel cuesta más o menos lo que mide la fila, así que el coste total es el número de niveles por la longitud de la fila.
Eso crece mucho más despacio que comparar de uno en uno (longitud por longitud).

largo de la fila8
capas de división3
costo por capa8
costo de fusión (capas x por capa)24
una por una sería28
Aunque la fila se duplique, las capas crecen solo en una. Así que capas por costo por capa crece mucho más lento que una por una (largo por largo).

Despliega los niveles y cambia la longitud de la fila. Niveles x un nivel = crece más despacio que de uno en uno.

La fórmula exacta la aprenderás más adelante.
Por ahora basta con quedarse con la idea: al partir por la mitad, los niveles crecen despacio y cada nivel se combina con poco esfuerzo, así que todo va más rápido.
Este solo movimiento de partir y combinar cambia la velocidad por completo.

05

Resumen

Hilado en una sola idea, queda así.
Ordenar comparando de uno en uno se vuelve más lento cuanto más larga es la fila.
Por eso se parte la fila por la mitad y se sigue partiendo hasta tener casillas sueltas, que ya son trozos ordenados.
Al combinar esos pares ordenados como una cremallera, solo hay que combinar tantas veces como niveles hay, y toda la fila se ordena mucho más rápido.
Partir y combinar: ese es el corazón de una ordenación más lista.

Pulsa los cuatro pasos uno tras otro y sigue una vuelta completa. Partir → casilla suelta → combinar → solo tantos niveles como hagan falta = rápido.

Aquí siempre partimos tranquilamente por la mitad.
Pero hay un primo que elige el punto de división de otra manera: en lugar de la mitad, toma una casilla como pivote y divide el resto en menores y mayores.
Cómo elegir ese pivote es una historia para más adelante.
Hoy quédate solo con esto: si partes por la mitad y combinas, todo va más rápido.

En una líneaOrdenar comparando vecinos de uno en uno se vuelve lento cuando la fila crece, porque las comparaciones se disparan. La forma más lista es partir la fila por la mitad, ordenar cada mitad y combinar las dos mitades ordenadas como una cremallera. Si partes hasta el final, solo quedan casillas sueltas, que ya están ordenadas, y combinar es rápido porque solo se comparan los dos principios. Como partir por la mitad hace que los niveles crezcan despacio y cada nivel cuesta lo que mide la fila, el trabajo termina mucho antes que de uno en uno.
← Algoritmos
¿Te fue útil? Apoyar seegongsik