Merge Sort
เทคนิคการจัดเรียงแบบ Merge Sort พัฒนามาจากเทคนิคแบ่งแยกและเอาชนะ (divide and conquer technique) เราแบ่งชุดข้อมูลทั้งหมดออกเป็นส่วนย่อยๆ และรวมมันเข้าด้วยกันเป็นชิ้นส่วนที่ใหญ่ขึ้นในลำดับที่จัดเรียงแล้ว มันมีประสิทธิภาพมากสำหรับกรณีแย่ที่สุดด้วย เพราะอัลกอริทึมนี้มีความซับซ้อนด้านเวลาต่ำสำหรับกรณีแย่ที่สุดเช่นกัน
ความซับซ้อนของ Merge Sort
Time Complexity: O(n log n) สำหรับทุกกรณี
Space Complexity: O(n)
Input - รายการที่ไม่ได้จัดเรียง: 14 20 78 98 20 45 Output - Array after Sorting: 14 20 20 45 78 98
อัลกอริทึม
merge(array, left, middle, right)
Input: อาร์เรย์ชุดข้อมูล, ดัชนี left, middle และ right
Output: รายการที่รวมแล้ว
เริ่มต้น
nLeft := m - left + 1
nRight := right - m
ประกาศอาร์เรย์ leftArr และ rightArr ขนาด nLeft และ nRight ตามลำดับ
for i := 0 ถึง nLeft
leftArr[i] := array[left + i]
for j := 0 ถึง nRight
rightArr[j] := array[middle + j + 1]
i := 0, j := 0, k := left
while i < nLeft AND j < nRight
if leftArr[i] <= rightArr[j] then
array[k] = leftArr[i]
i := i+1
else
array[k] = rightArr[j]
j := j+1
k := k+1
while i < nLeft
array[k] := leftArr[i]
i := i+1
k := k+1
while j < nRight
array[k] := rightArr[j]
j := j+1
k := k+1
สิ้นสุด
mergeSort(array, left, right)
Input: อาร์เรย์ข้อมูล, และขอบเขตล่างและบนของอาร์เรย์
Output: อาร์เรย์ที่จัดเรียงแล้ว
เริ่มต้น
if left < right then
mid := left + (right - left) / 2
mergeSort(array, left, mid)
mergeSort(array, mid+1, right)
merge(array, left, mid, right)
สิ้นสุด
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
void swapping(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}
void display(int *array, int size) {
for(int i = 0; i < size; i++)
cout << array[i] << " ";
cout << endl;
}
void merge(int *array, int l, int m, int r) {
int i, j, k, nl, nr;
nl = m-l+1; nr = r-m;
int larr[nl], rarr[nr];
for(i = 0; i < nl; i++)
larr[i] = array[l+i];
for(j = 0; j < nr; j++)
rarr[j] = array[m+1+j];
i = 0; j = 0; k = l;
while(i < nl && j < nr) {
if(larr[i] <= rarr[j]) {
array[k] = larr[i];
i++;
} else {
array[k] = rarr[j];
j++;
}
k++;
}
while(i < nl) {
array[k] = larr[i];
i++; k++;
}
while(j < nr) {
array[k] = rarr[j];
j++; k++;
}
}
void mergeSort(int *array, int l, int r) {
if(l < r) {
int m = l+(r-l)/2;
mergeSort(array, l, m);
mergeSort(array, m+1, r);
merge(array, l, m, r);
}
}
int main() {
int n;
cout << "Enter the number of elements: ";
cin >> n;
int arr[n];
cout << "Enter elements:" << endl;
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
cout << "Array before Sorting: ";
display(arr, n);
mergeSort(arr, 0, n-1);
cout << "Array after Sorting: ";
display(arr, n);
}
ผลลัพธ์ตัวอย่าง
Enter the number of elements: 6 Enter elements: 14 20 78 98 20 45 Array before Sorting: 14 20 78 98 20 45 Array after Sorting: 14 20 20 45 78 98