Unisci ordinamento è un algoritmo di ordinamento che funziona suddividendo un determinato elenco a metà, ordinando ricorsivamente entrambi gli elenchi più piccoli e riunendoli nuovamente in un elenco ordinato. Il caso base della ricorsione sta arrivando a un elenco singleton, che non può essere ulteriormente diviso ma è già per definizione ordinato.
L'esecuzione dell'algoritmo nell'elenco [1,7,6,3,3,2,5]
può essere visualizzata nel modo seguente:
[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]
L'obiettivo
Scrivi un programma o una funzione che accetta un elenco di numeri interi in modo ragionevole come input e visualizza le diverse partizioni di questo elenco mentre viene ordinato da un algoritmo di ordinamento di tipo merge. Ciò significa che non devi produrre un grafico come sopra, ma solo gli elenchi vanno bene:
[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]
Inoltre, qualsiasi ragionevole notazione di elenco va bene, quindi anche un risultato valido sarebbe:
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
Infine, il modo di dividere un elenco in due elenchi più piccoli dipende da te purché la lunghezza di entrambi gli elenchi risultanti differisca al massimo di uno. Ciò significa che invece di dividere [3,2,4,3,7]
in [3,2,4]
e [3,7]
, puoi anche dividere prendendo elementi in indici pari e dispari ( [3,4,7]
e [2,3]
) o anche randomizzare la divisione ogni volta.
Questo è code-golf , quindi vince il codice più breve in qualsiasi lingua misurato in byte.
Casi test
Come notato sopra, il formato attuale e il modo di dividere gli elenchi a metà dipende da te.
[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]]
stage è in realtà la soluzione corretta, poiché l'ordinamento per merge funziona in modo ricorsivo. Cioè se iniziamo con [1,2,3,4,5,6]
e lo dividiamo in [1,2,3]
e [4,5,6]
, quindi quegli elenchi vengono elaborati indipendentemente fino a quando non vengono uniti nel passaggio finale.
[3]
e [2,1]
, allora quelli sono su rami diversi, quindi non possiamo unirci [3]
e [2]
dopo [2,1]
viene diviso in [2]
e [1]
.