La ordenación por fusión es un algoritmo de ordenación que funciona dividiendo una lista dada por la mitad, ordenando recursivamente ambas listas más pequeñas y fusionándolas nuevamente en una lista ordenada. El caso base de la recursión es llegar a una lista singleton, que no se puede dividir más, pero por definición ya está ordenada.
La ejecución del algoritmo en la lista [1,7,6,3,3,2,5]
se puede visualizar de la siguiente manera:
[1,7,6,3,3,2,5]
/ \ split
[1,7,6,3] [3,2,5]
/ \ / \ split
[1,7] [6,3] [3,2] [5]
/ \ / \ / \ | split
[1] [7] [6] [3] [3] [2] [5]
\ / \ / \ / | merge
[1,7] [3,6] [2,3] [5]
\ / \ / merge
[1,3,6,7] [2,3,5]
\ / merge
[1,2,3,3,5,6,7]
La tarea
Escriba un programa o función que tome una lista de enteros de cualquier manera razonable como entrada y visualice las diferentes particiones de esta lista mientras se ordena mediante un algoritmo de clasificación de fusión. Esto significa que no tiene que generar un gráfico como el anterior, pero solo las listas están bien:
[1,7,6,3,3,2,5]
[1,7,6,3][3,2,5]
[1,7][6,3][3,2][5]
[1][7][6][3][3][2][5]
[1,7][3,6][2,3][5]
[1,3,6,7][2,3,5]
[1,2,3,3,5,6,7]
Además, cualquier notación de lista razonable está bien, por lo tanto, lo siguiente también sería una salida válida:
1 7 6 3 3 2 5
1 7 6 3|3 2 5
1 7|6 3|3 2|5
1|7|6|3|3|2|5
1 7|3 6|2 3|5
1 3 6 7|2 3 5
1 2 3 3 5 6 7
Finalmente, la forma de dividir una lista en dos listas más pequeñas depende de usted, siempre que la longitud de ambas listas resultantes difiera como máximo en una. Eso significa que, en lugar de dividirse [3,2,4,3,7]
en [3,2,4]
y [3,7]
, también podría dividirse tomando elementos en índices pares e impares ( [3,4,7]
y [2,3]
) o incluso aleatorizar la división cada vez.
Este es el código de golf , por lo que gana el código más corto en cualquier idioma medido en bytes.
Casos de prueba
Como se señaló anteriormente, el formato real y la forma de dividir las listas a la mitad depende de usted.
[10,2]
[10][2]
[2,10]
[4,17,1,32]
[4,17][1,32]
[4][17][1][32]
[4,17][1,32]
[1,4,17,32]
[6,5,4,3,2,1]
[6,5,4][3,2,1]
[6,5][4][3,2][1]
[6][5][4][3][2][1]
[5,6][4][2,3][1] <- Important: This step cannot be [5,6][3,4][1,2], because 3 and 4 are on different branches in the the tree
[4,5,6][1,2,3]
[1,2,3,4,5,6]
[[1,2],[3],[4,5],[6]]
etapa es en realidad la solución correcta, ya que la ordenación por fusión funciona de forma recursiva. Es decir, si comenzamos [1,2,3,4,5,6]
y lo dividimos en [1,2,3]
y [4,5,6]
, esas listas se procesan de forma independiente hasta que se fusionen en el paso final.
[3]
y [2,1]
, entonces están en diferentes ramas, por lo que no podemos fusionar [3]
y [2]
luego [2,1]
se divide en [2]
y [1]
.