สมมติว่าเรามีชุดขององค์ประกอบ เราต้องค้นหาว่าการเรียงสับเปลี่ยนขององค์ประกอบใดจะส่งผลให้เกิดกรณีที่เลวร้ายที่สุดของ 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