Merge Sort ist ein Sortieralgorithmus, bei dem eine bestimmte Liste in zwei Hälften geteilt, beide kleineren Listen rekursiv sortiert und zu einer sortierten Liste zusammengeführt werden. Der Grundfall der Rekursion trifft auf eine Singleton-Liste, die nicht weiter aufgeteilt werden kann, sondern per Definition bereits sortiert ist.
Die Ausführung des Algorithmus in der Liste [1,7,6,3,3,2,5]
kann folgendermaßen visualisiert werden:
[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]
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die eine Liste von ganzen Zahlen als Eingabe verwendet und die verschiedenen Partitionen dieser Liste visualisiert, während sie nach einem Sortieralgorithmus für das Zusammenführen sortiert werden. Dies bedeutet, dass Sie kein Diagramm wie oben ausgeben müssen, aber nur die Listen sind in Ordnung:
[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]
Darüber hinaus ist jede vernünftige Listennotation in Ordnung, daher wäre auch Folgendes eine gültige Ausgabe:
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
Schließlich liegt es an Ihnen, eine Liste in zwei kleinere Listen aufzuteilen, solange sich die Länge der beiden resultierenden Listen höchstens um eins unterscheidet. Das heißt, anstatt [3,2,4,3,7]
in [3,2,4]
und [3,7]
aufzuteilen, können Sie auch aufteilen, indem Sie jedes Mal Elemente mit geraden und ungeraden Indizes ( [3,4,7]
und [2,3]
) verwenden oder die Aufteilung nach dem Zufallsprinzip vornehmen.
Das ist Code-Golf , also gewinnt der kürzeste Code in jeder Sprache, gemessen in Bytes.
Testfälle
Wie oben erwähnt, liegt das tatsächliche Format und die Möglichkeit, Listen in zwei Hälften zu teilen, bei Ihnen.
[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]]
Bühne ist eigentlich die richtige Lösung, da die Sortierung beim Zusammenführen rekursiv funktioniert. Das heißt , wenn wir beginnen mit [1,2,3,4,5,6]
und teilen Sie es in [1,2,3]
und [4,5,6]
, dann werden diese Listen unabhängig voneinander verarbeitet , bis sie im letzten Schritt zusammengeführt werden.
[3]
und aufteilen [2,1]
, befinden sich diese auf verschiedenen Zweigen, sodass wir nicht zusammenführen können [3]
und [2]
danach [2,1]
in [2]
und aufgeteilt wird [1]
.