Merge sort adalah algoritma pengurutan yang berfungsi dengan memisahkan daftar yang diberikan menjadi dua, menyortir secara rekursif kedua daftar yang lebih kecil, dan menggabungkannya kembali menjadi satu daftar yang diurutkan. Kasus dasar rekursi adalah tiba pada daftar tunggal, yang tidak dapat dibagi lebih lanjut tetapi per definisi sudah diurutkan.
Eksekusi algoritma pada daftar [1,7,6,3,3,2,5]
dapat divisualisasikan dengan cara berikut:
[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]
Tugas
Tulis program atau fungsi yang mengambil daftar bilangan bulat dengan cara apa pun yang masuk akal sebagai input dan memvisualisasikan partisi yang berbeda dari daftar ini saat sedang diurutkan oleh algoritma pengurutan gabungan. Ini berarti Anda tidak perlu menampilkan grafik seperti di atas, tetapi daftar saja tidak apa-apa:
[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]
Selain itu, notasi daftar yang masuk akal baik-baik saja, oleh karena itu yang berikut ini juga akan menjadi output yang valid:
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
Akhirnya, cara untuk membagi daftar menjadi dua daftar yang lebih kecil adalah terserah Anda sepanjang panjang kedua daftar yang dihasilkan paling banyak berbeda satu per satu. Itu berarti alih-alih membelah [3,2,4,3,7]
menjadi [3,2,4]
dan [3,7]
, Anda juga bisa membelah dengan mengambil elemen pada indeks genap dan ganjil ( [3,4,7]
dan [2,3]
) atau bahkan mengacak perpecahan setiap waktu.
Ini adalah kode-golf , jadi kode terpendek dalam bahasa apa pun yang diukur dalam byte menang.
Uji kasus
Seperti disebutkan di atas, format aktual dan cara untuk membagi daftar menjadi dua terserah Anda.
[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]]
Panggung sebenarnya adalah solusi yang tepat, karena merge sort bekerja secara rekursif. Itu adalah jika kita mulai dengan [1,2,3,4,5,6]
dan membaginya menjadi [1,2,3]
dan [4,5,6]
, maka daftar tersebut diproses secara independen sampai mereka bergabung pada langkah terakhir.
[3]
dan [2,1]
, maka itu ada di cabang yang berbeda, jadi kita tidak bisa menggabungkan [3]
dan [2]
setelah [2,1]
itu dibagi menjadi [2]
dan [1]
.