Merge sort ซึ่งเป็นอัลกอริธึมการเรียงลำดับตามเทคนิคการแบ่งและพิชิตคืออะไร ความซับซ้อนของเวลาของการเรียงลำดับการผสานคือ O(n บันทึก n) ขั้นแรก อัลกอริทึมจะแบ่งอาร์เรย์ออกเป็นครึ่งหนึ่งเท่าๆ กัน จากนั้นจึงรวมเข้าด้วยกันในลักษณะที่แน่นอน
การจัดเรียงแบบวนซ้ำ
ในการจัดเรียงแบบวนซ้ำ เราจะแบ่งองค์ประกอบออกเป็นครึ่งหนึ่งเท่าๆ กันโดยใช้วิธีการแบบเรียกซ้ำ จากนั้นรวมกลับเป็นอาร์เรย์ที่จัดเรียงโดยใช้วิธีการวนซ้ำ
โปรแกรมสำหรับการจัดเรียงแบบวนซ้ำ
/* โปรแกรม Recursive C สำหรับการเรียงลำดับการผสาน */
ตัวอย่าง
#include<stdlib.h> #include<stdio.h> void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; i = 0, j = 0, k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } void iterativeMergeSort(int arr[], int l, int r) { if (l < r){ int mid = l+(r-l)/2; iterativeMergeSort(arr, l, mid); iterativeMergeSort(arr, mid+1, r); merge(arr, l, mid, r); } } int main(){ int arr[] = {12, 11, 13, 5, 6, 7}; int size = sizeof(arr)/sizeof(arr[0]); printf("\t\t ITERATIVE MERGE SORT \n"); printf("Unsorted Array : \t"); for (int i=0; i < size; i++) printf("%d ",arr[i]); iterativeMergeSort(arr, 0, size - 1); printf("\nSorted array : \t"); for (int i=0; i < size; i++) printf("%d ", arr[i]); printf("\n"); return 0; }
ผลลัพธ์
ITERATIVE MERGE SORT Unsorted Array : 12 11 13 5 6 7 Sorted array : 5 6 7 11 12 13