A classificação por mesclagem é um algoritmo de classificação que funciona dividindo uma determinada lista pela metade, classificando recursivamente ambas as listas menores e juntando-as novamente em uma lista classificada. O caso base da recursão está chegando a uma lista de singleton, que não pode ser dividida ainda mais, mas já está classificada por definição.
A execução do algoritmo na lista [1,7,6,3,3,2,5]
pode ser visualizada da seguinte maneira:
[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]
A tarefa
Escreva um programa ou função que pegue uma lista de números inteiros de qualquer maneira razoável como entrada e visualize as diferentes partições dessa lista enquanto estiver sendo classificado por um algoritmo de classificação de mesclagem. Isso significa que você não precisa gerar um gráfico como acima, mas apenas as listas são boas:
[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]
Além disso, qualquer notação razoável da lista é adequada; portanto, o seguinte também seria uma saída 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, a maneira de dividir uma lista em duas listas menores é com você, desde que o comprimento das duas listas resultantes seja diferente, no máximo, uma. Isso significa que, em vez de dividir [3,2,4,3,7]
em [3,2,4]
e [3,7]
, você também pode dividir usando elementos em índices pares e ímpares ( [3,4,7]
e [2,3]
) ou mesmo aleatoriamente a divisão toda vez.
Isso é código-golfe , portanto o código mais curto em qualquer idioma medido em bytes vence.
Casos de teste
Como observado acima, o formato real e a maneira de dividir as listas pela metade são com você.
[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]]
estágio é realmente a solução correta, pois a classificação por mesclagem está funcionando recursivamente. Ou seja, se começarmos [1,2,3,4,5,6]
e dividirmos em [1,2,3]
e [4,5,6]
, essas listas serão processadas independentemente até serem mescladas na etapa final.
[3]
e [2,1]
, então eles estarão em ramos diferentes, portanto não podemos mesclar [3]
e [2]
depois [2,1]
dividir em [2]
e [1]
.