สมมติว่าเรามีชุดขององค์ประกอบ เราต้องค้นหาว่าการเรียงสับเปลี่ยนขององค์ประกอบใดจะส่งผลให้เกิดกรณีที่เลวร้ายที่สุดของ Merge Sort? ตามที่เราทราบอย่างไม่มีอาการ การเรียงลำดับการผสานจะใช้เวลา O (n บันทึก n) เสมอ แต่บางกรณีจำเป็นต้องมีการเปรียบเทียบมากขึ้นและใช้เวลามากขึ้น ที่นี่เราต้องค้นหาการเปลี่ยนแปลงขององค์ประกอบอินพุตซึ่งจะต้องมีการเปรียบเทียบจำนวนมากขึ้นเมื่อทำการจัดเรียงโดยใช้อัลกอริธึม Merge Sort ทั่วไป
ดังนั้นหากอินพุตเป็น [11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26] ผลลัพธ์จะเป็น [11,19 ,15,23,13,21,17,25,12,20,16,24,14,22,18,26].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน merge() ซึ่งจะใช้ array arr, array left, array right, l_index, m_index, r_index,
- สำหรับการเริ่มต้น i :=0 เมื่อ i <=m_index - l_index อัปเดต (เพิ่ม i โดย 1) ทำ −
- arr[i] :=left[i]
- สำหรับการเริ่มต้น j :=0 เมื่อ j
- arr[i + j] =ถูกต้อง[j]
- left[i] :=arr[i * 2]
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; void display(int A[], int size) { for (int i = 0; i < size; i++) cout << A[i] << " "; cout << endl; } int merge(int arr[], int left[], int right[],int l_index, int m_index, int r_index) { int i; for (i = 0; i <= m_index - l_index; i++) arr[i] = left[i]; for (int j = 0; j < r_index - m_index; j++) arr[i + j] = right[j]; } int divide(int arr[], int left[], int right[], int l_index, int m_index, int r_index) { for (int i = 0; i <= m_index - l_index; i++) left[i] = arr[i * 2]; for (int i = 0; i < r_index - m_index; i++) right[i] = arr[i * 2 + 1]; } int gen_worst_seq(int arr[], int l_index, int r_index) { if (l_index < r_index) { int m_index = l_index + (r_index - l_index) / 2; int left[m_index - l_index + 1]; int right[r_index - m_index]; divide(arr, left, right, l_index, m_index, r_index); gen_worst_seq(left, l_index, m_index); gen_worst_seq(right, m_index + 1, r_index); merge(arr, left, right, l_index, m_index, r_index); } } int main() { int arr[] = {11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; int n = sizeof(arr) / sizeof(arr[0]); gen_worst_seq(arr, 0, n - 1); display(arr, n); }
อินพุต
11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
ผลลัพธ์
11 19 15 23 13 21 17 25 12 20 16 24 14 22 18 26