Le tri par fusion est un algorithme de tri qui fonctionne en divisant une liste donnée en deux, en triant récursivement les deux listes plus petites et en les fusionnant à nouveau dans une liste triée. Le cas de base de la récursivité arrive à une liste singleton, qui ne peut pas être divisée davantage mais qui est par définition déjà triée.
L'exécution de l'algorithme sur la liste [1,7,6,3,3,2,5]
peut être visualisée de la manière suivante:
[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 tâche
Écrivez un programme ou une fonction qui prend une liste d'entiers de manière raisonnable en entrée et visualise les différentes partitions de cette liste tout en étant triée par un algorithme de tri par fusion. Cela signifie que vous n'avez pas besoin de générer un graphique comme ci-dessus, mais juste les listes sont 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]
De plus, toute notation de liste raisonnable est très bien, donc ce qui suit serait également une sortie valide:
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
Enfin, la façon de diviser une liste en deux listes plus petites vous appartient tant que la longueur des deux listes résultantes diffère au maximum d'une unité. Cela signifie qu'au lieu de diviser [3,2,4,3,7]
en [3,2,4]
et [3,7]
, vous pouvez également diviser en prenant des éléments à des index pairs et impairs ( [3,4,7]
et [2,3]
) ou même randomiser la division à chaque fois.
C'est le code-golf , donc le code le plus court dans n'importe quelle langue, mesuré en octets, gagne.
Cas de test
Comme indiqué ci-dessus, le format réel et la façon de diviser les listes en deux sont à vous.
[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]]
étape est en fait la bonne solution, car le tri par fusion fonctionne récursivement. C'est-à-dire si nous commençons par le [1,2,3,4,5,6]
diviser en [1,2,3]
et [4,5,6]
, puis ces listes sont traitées indépendamment jusqu'à ce qu'elles soient fusionnées à l'étape finale.
[3]
et [2,1]
, alors ceux-ci sont sur des branches différentes, donc nous ne pouvons pas fusionner [3]
et [2]
après [2,1]
est divisé en [2]
et [1]
.