Birleştirme sıralaması , belirli bir listeyi ikiye bölerek, her iki küçük listeyi tekrar tekrar sıralayarak ve bunları bir sıralanan listeyle birleştirerek çalışan bir sıralama algoritmasıdır. Özyinelemenin temel durumu, daha fazla bölünemeyen, ancak önceden tanımlanmış olan tek bir listeye varmaktır.
Algoritmanın listede yürütülmesi [1,7,6,3,3,2,5]
aşağıdaki şekilde görselleştirilebilir:
[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]
Görev
Tamsayıların listesini girdi olarak kabul eden ve bu listenin farklı bölümlerini görselleştiren bir birleştirme sıralama algoritmasına göre sıralanan bir program veya işlev yazın. Bu , yukarıdaki gibi bir grafik çıkarmanız gerekmediği anlamına gelir , ancak yalnızca listeler iyidir:
[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]
Ayrıca, makul herhangi bir liste gösterimi iyi değildir, bu nedenle aşağıdakiler de geçerli bir çıktı olacaktır:
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
Son olarak, bir listeyi iki küçük listeye ayırmanın yolu, her iki sonuç listesinin uzunluğu en fazla bir farklılık gösterdiği sürece size bağlıdır. Bunun anlamı, [3,2,4,3,7]
içine bölünmek yerine [3,2,4]
ve [3,7]
aynı zamanda tek ve tek indeksleri ( [3,4,7]
ve [2,3]
) de alarak elementleri ayırmak veya hatta her zaman bölmeyi rastgele yapmak anlamına gelebilir .
Bu kod golf , yani bayt cinsinden ölçülen herhangi bir dilde en kısa kod kazanır.
Test durumları
Yukarıda belirtildiği gibi, gerçek format ve listeleri ikiye bölme şekli size bağlıdır.
[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]]
sahne aslında doğru çözümdür. Biz başlarsak budur [1,2,3,4,5,6]
ve bölmek [1,2,3]
ve [4,5,6]
onlar son adımda birleştirilir kadar sonra bu listelere bağımsız işlenir.
[3]
ve [2,1]
biz birleştiremezsiniz böylece daha sonra bu, farklı dallarda olan [3]
ve [2]
sonra [2,1]
bölünmüş içine [2]
ve [1]
.