Scalanie sortowania to algorytm sortowania, który działa poprzez podzielenie danej listy na pół, rekurencyjne sortowanie obu mniejszych list i scalenie ich z powrotem w jedną posortowaną listę. Podstawowy przypadek rekurencji dochodzi do listy singletonów, której nie można dalej dzielić, ale według definicji jest już posortowana.
Wykonanie algorytmu na liście [1,7,6,3,3,2,5]
można wizualizować w następujący sposób:
[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]
Zadanie
Napisz program lub funkcję, która pobiera listę liczb całkowitych w jakikolwiek rozsądny sposób jako dane wejściowe i wizualizuje różne partycje tej listy podczas sortowania według algorytmu sortowania po scaleniu. Oznacza to, że nie musisz generować wykresu jak powyżej, ale tylko listy są w porządku:
[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]
Co więcej, każda rozsądna notacja na liście jest w porządku, dlatego następujące dane byłyby również prawidłowymi danymi wyjściowymi:
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
Wreszcie sposób podzielenia listy na dwie mniejsze listy zależy od ciebie, o ile długość obu list wynikowych różni się co najwyżej o jedną. Oznacza to, że zamiast dzielić [3,2,4,3,7]
na [3,2,4]
i [3,7]
, możesz również dzielić, biorąc elementy o indeksach parzystych i nieparzystych ( [3,4,7]
i [2,3]
), a nawet za każdym razem losować podział.
To jest golf golfowy , więc wygrywa najkrótszy kod w dowolnym języku mierzony w bajtach.
Przypadki testowe
Jak wspomniano powyżej, faktyczny format i sposób podziału list na pół zależy od Ciebie.
[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]]
Etap jest właściwie właściwym rozwiązaniem, ponieważ sortowanie scalające działa rekurencyjnie. To znaczy, jeśli zaczniemy [1,2,3,4,5,6]
i podzielimy na[1,2,3]
i [4,5,6]
, a następnie wykazy te są przetwarzane niezależnie, dopóki nie zostaną połączone w końcowym etapie.
[3]
i [2,1]
, to są one na różnych gałęziach, więc nie możemy się połączyć, [3]
a [2]
po [2,1]
jest podzielony na [2]
i [1]
.