ผู้ใช้:Phizaz/merge sort
![]() ภาพตัวอย่างการเรียงลำดับแบบผสาน เร่ิมด้วยการแบ่งข้อมูลออกเป็นส่วนที่เล็กที่สุด แล้วเร่ิมผสานข้อมูลก้อนเล็ก ๆ เข้าด้วยกันกลายเป็นข้อมูลก้อนที่ใหญ่ขึ้น ในที่สุดข้อมูลทุกชิ้นจะเรียงลำดับอย่างสมบูรณ์ | |
ประเภท | ขั้นตอนวิธีการเรียงลำดับ |
---|---|
โครงสร้างข้อมูล | แถวลำดับ (Array) |
ประสิทธิภาพเมื่อเกิดกรณีแย่ที่สุด | O(n log n) |
ประสิทธิภาพเมื่อเกิดกรณีดีที่สุด | O(n log n) |
ประสิทธิภาพเมื่อเกิดกรณีทั่วไป | O(n log n) |
ปริมาณความต้องการพื้นที่เมื่อเกิดกรณีแย่ที่สุด | O(n) รวมทั้งแถวลำดับที่ช่วยในการเรียงอีกเท่าตัว |
ในสาขาวิทยาการคอมพิวเตอร์ การเรียงลำดับแบบผสาน (อังกฤษ: Merge Sort) เป็นขั้นตอนวิธีในการเรียงลำดับที่อาศัยการเปรียบเทียบ และยังเป็นตัวอย่างขั้นตอนวิธีที่ใช้หลักการแบ่งแยกและเอาชนะทำให้ชั้นตอนวิธีนี้มีประสิทธิภาพ O(n log n) ในการอิมพลิเมนต์เพื่อการใช้งานจริง ๆ นั้นสามารถทำได้ทั้งแบบบนลงล่าง (Top-down) และแบบล่างขึ้นบน (Bottom-up) อนึ่งในการอิมพลิเมนต์โดยทั่วไปแล้วการเรียงแบบนี้จะไม่ศูนย์เสียลำดับของข้อมูลที่มีค่าเท่ากัน นั่นคือเป็นการเรียงที่เสถียร การเรียงลำดับแบบผสาน ถูกเสนอขึ้นครั้งแรกโดยจอห์น ฟอน นอยมันน์ในปี ค.ศ. 1945[1]
ขั้นตอนวิธีแก้ไข
ขั้นตอนวิธีอาศัยหลักการแบ่งแยกและเอาชนะและการเวียนบังเกิด โดยมีรายละเอียดดังนี้
- (ขั้นตอนการแบ่ง) สมมติว่ามีข้อมูลอยู่ n ชุด
- ถ้ามีข้อมูลแค่ 1 ชุด นั่นคือข้อมูลนั้นเรียงลำดับแล้ว
- ถ้ามีข้อมูลมากกว่านั้น ให้แบ่งเป็นสองส่วน แล้วทำการเวียนบังเกิด
- (ขั้นตอนเอาชนะ) เมื่อถึงขั้นตอนนี้จะได้ข้อมูลสองส่วน (โดยที่แต่ละส่วนเรียงในส่วนของตัวเองเรียบร้อยแล้ว) ทำการรวมข้อมูลทั้งสองส่วนนั้นให้เป็นข้อมูลก้อนเดียวที่ทั้งก้อนนั้นเรียงลำดับแล้ว
การอิมพลิเมนต์ แบบบนลงล่างแก้ไข
ตัวอย่างการอิมพลิเมนต์ด้วยรหัสเทียม ทำการเรียงลำดับด้วยการโยนลิสต์ข้อมูลไปที่ฟังก์ชัน MergeSort ผลลัพธ์ที่ออกจากฟังก์ชันนั้นคือข้อมูลที่เรียงลำดับแล้ว
MergeSort (array A) {
if (A.size == 0) return A
mid = A.size / 2
AA = MergeSort(A[0...mid])
BB = MergeSort(A[mid...A.size])
return MeregSort_Merge(AA, BB)
}
MergeSort_Merge (array A, array B) {
C = new array
aa = 0
bb = 0
while (aa < A.size and bb < B.size) {
if (A[aa] < B[bb]) {
C[] = A[aa++]
} else if (A[aa] > B[bb]) {
C[] = B[bb++]
} else {
aa += 1
bb += 1
}
}
while (aa < A.size) C[] = A[aa++]
while (bb < B.size) C[] = B[bb++]
return C
}
อ้างอิงแก้ไข
- ↑ Knuth (1998, p. 158)
บรรณานุกรมแก้ไข
- Knuth, Donald (1998). "Section 5.2.4: Sorting by Merging". Sorting and Searching. The Art of Computer Programming. Vol. 3 (2nd ed.). Addison-Wesley. pp. 158–168. ISBN 0-201-89685-0.
{{cite book}}
:|ref=harv
ไม่ถูกต้อง (help)