Merge sortเป็นอัลกอริทึมการเรียงลำดับที่ทำงานโดยแยกรายการที่กำหนดเป็นครึ่งแล้วทำการเรียงลำดับซ้ำทั้งรายการเล็ก ๆ และรวมกลับเข้าด้วยกันเป็นหนึ่งรายการเรียงลำดับ เคสพื้นฐานของการเรียกซ้ำจะมาถึงรายการเดี่ยวซึ่งไม่สามารถแยกได้อีกต่อไป แต่เรียงตามนิยามแล้ว
การดำเนินการของอัลกอริทึมในรายการ[1,7,6,3,3,2,5]
สามารถมองเห็นได้ด้วยวิธีดังต่อไปนี้:
[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]
งาน
เขียนโปรแกรมหรือฟังก์ชั่นที่รับรายการจำนวนเต็มด้วยวิธีการที่สมเหตุสมผลเช่นการป้อนข้อมูลและแสดงภาพพาร์ทิชันที่แตกต่างกันของรายการนี้ในขณะที่เรียงลำดับโดยอัลกอริทึมการเรียงแบบผสาน ซึ่งหมายความว่าคุณไม่จำเป็นต้องแสดงกราฟดังกล่าวข้างต้น แต่มีเพียงรายการที่ใช้ได้:
[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]
นอกจากนี้สัญกรณ์รายการที่สมเหตุสมผลก็ดีดังนั้นต่อไปนี้จะเป็นผลลัพธ์ที่ถูกต้อง:
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
ท้ายสุดวิธีแบ่งรายการในสองรายการเล็ก ๆ ขึ้นอยู่กับคุณตราบใดที่ความยาวของรายการที่ได้ทั้งสองรายการแตกต่างกันมากที่สุด นั่นหมายความว่าแทนที่จะแยกออก[3,2,4,3,7]
เป็น[3,2,4]
และ[3,7]
คุณยังสามารถแยกโดยใช้องค์ประกอบที่ดัชนีคู่และคี่ ( [3,4,7]
และ[2,3]
) หรือสุ่มแยกแยกทุกครั้ง
นี่คือcode-golfดังนั้นโค้ดที่สั้นที่สุดในภาษาใด ๆ ที่วัดเป็นไบต์จะเป็นผู้ชนะ
กรณีทดสอบ
ตามที่ระบุไว้ข้างต้นรูปแบบที่แท้จริงและวิธีแบ่งรายการในครึ่งนั้นขึ้นอยู่กับคุณ
[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]]
จริง ๆ แล้วขั้นตอนนี้เป็นวิธีการแก้ไขที่ถูกต้องเนื่องจากการเรียงลำดับผสานนั้นใช้งานซ้ำ นั่นคือถ้าเราเริ่มต้นด้วย[1,2,3,4,5,6]
และแยกมันเป็น[1,2,3]
และ[4,5,6]
จากนั้นรายการเหล่านั้นจะถูกประมวลผลอย่างอิสระจนกว่าจะถูกรวมเข้าด้วยกันในขั้นตอนสุดท้าย
[3]
และ[2,1]
จากนั้นผู้ที่อยู่ในสาขาที่แตกต่างกันดังนั้นเราจึงไม่สามารถผสาน[3]
และ[2]
หลังจากที่[2,1]
ถูกแบ่งออกเป็นและ[2]
[1]