seegongsik
Mis palabras
Algoritmos

Ordenar de forma más lista

La vez pasada ordenamos comparando vecinos y enviando el mayor atrás. Funciona, pero se vuelve muy lento cuando la fila crece. Cuantas más cartas, más comparaciones se acumulan. ¿No hay una forma más lista? La hay. Partimos la fila por la mitad.

01

Una por una es lento

La forma de la vez pasada era simple y bonita.
Compara vecinos, el mayor atrás.
Pero cuando la fila se alarga,
hay demasiado que comparar.
El doble de cartas,
y las comparaciones saltan al cuádruple.
Cuatro es rápido,
pero treinta y dos es larguísimo.

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.

Prueba a duplicar la fila. (El largo se duplica → las comparaciones saltan al cuádruple)

La barra sube de forma alarmante.
Cuanto más larga la fila,
peor se pone la lentitud.
El problema es tratar
toda la fila como un solo bulto
y comparar hasta el final.
Entonces, ¿y si
rompemos el bulto?

02

Pártelo por la mitad

No manejes la fila larga entera.
Pártela por la mitad.
Esa mitad por la mitad otra vez,
y esa mitad también.
Sigue partiendo,
y al final solo quedan sueltos.
Pero un suelto
ya está ordenado.
Solo, no hay nada que comparar.

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 a la mitad. (8 → 4+4 → 2+2+2+2 → sueltos)

¿Partir es todo el trabajo?
No, las piezas partidas
deben volver a unirse para hacer una fila.
Empareja los sueltos
y fusiónalos de dos en dos,
luego fusiona esos otra vez.
Y fusionar dos piezas ordenadas
resulta sorprendentemente fácil.
Veámoslo a continuación.

03

Fusiona dos ordenados

Tenemos dos grupos ordenados.
Para fusionarlos en una fila,
el truco es mirar solo los frentes.
Compara la primera carta de cada uno,
suelta la menor al resultado.
La siguiente carta llena ese hueco,
y comparas los frentes de nuevo.
Como al cerrar un cierre,
encajan de a una muesca a la vez.

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 los frentes de los dos grupos, suelta el menor. (Fusiona de a una muesca, como un cierre)

¿No es ingenioso?
Comparar todo un revoltijo era lento,
pero fusionar dos ya ordenados
es rápido, pues solo miras los frentes.
Gracias a partir,
obtenemos piezas pequeñas y ordenadas,
y al fusionarlas poco a poco
se vuelve una fila entera sin que te des cuenta.

04

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

¿Por qué es más rápido?
Como partimos a la mitad,
no hay muchas capas de división.
Duplica la fila,
y las capas crecen solo en una.
Y fusionar una capa
cuesta más o menos el largo de la fila.
Así que el costo total es
capas por largo de la fila.
Eso crece mucho más lento
que uno por uno (largo por largo).

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 las capas y cambia el largo. (Capas x por capa crece más lento que uno por uno)

La fórmula exacta viene después.
Por ahora, llévate solo la idea.
Cuando partes a la mitad,
las capas crecen perezosas,
y cada capa se fusiona ligera,
así que el todo se acelera.
Este solo movimiento, partir y fusionar,
cambia la velocidad de forma drástica.

05

Recapitulemos

Hilado en una sola línea, va así.
Ordenar comparando uno por uno
es lento cuando la fila crece.
Así que partimos la fila por la mitad,
y partimos hasta los sueltos,
que son piezas ya ordenadas.
Fusiona esos ordenados como un cierre,
y con solo tantas fusiones como capas,
toda la fila se ordena mucho más rápido.
Partir y fusionar.
Ese es el corazón de ordenar con inteligencia.

Toca los cuatro pasos en orden para seguir una vuelta. (Partir → sueltos → fusionar → solo capas = rápido)

Aquí, fusionar siempre partió con calma a la mitad.
Pero hay un primo
que elige su punto de división algo distinto.
En vez del medio,
toma una carta como marca
y parte en menores y mayores.
Cómo elegir esa marca
lo dejo para una historia más adelante.
Por hoy, llévate solo esto:
parte a la mitad y fusiona, y se vuelve rápido.

En una líneaOrdenar comparando vecinos uno por uno explota en comparaciones y se vuelve lento cuando la fila crece. El camino más listo es partir la fila por la mitad, ordenar cada parte, y luego fusionar las dos mitades ordenadas como un cierre. Partir hasta el final deja solo sueltos, y un suelto ya está ordenado. Fusionar es rápido porque solo comparas los dos frentes. Como partes a la mitad, las capas crecen despacio, y cada capa cuesta más o menos el largo de la fila, así que el todo termina mucho más rápido que uno por uno. Esta idea de partir y fusionar es el secreto de ordenar rápido.
Algoritmos
¿Te fue útil? Apoyar seegongsik