MergeSort(歸併排序)原理及C++代碼實現

歸併排序利用分治策略進行排序。原理以下數組

分解:分解待排的n個元素的序列成個具n/2個元素的兩個子序列。spa

解決:使用歸併排序遞歸地排序兩個子序列。code

合併:合併兩個已排序的子序列以產生已排序的答案。blog

歸併排序的時間複雜度是θ(nlgn)。排序

歸併排序是穩定排序之一。遞歸

歸併排序不是原址排序,在合併階段須要申請額外的數組空間。ast

代碼以下:(僅供參考)class

1 void MergeSort(int * const begin, int * const end) {
2     if (begin + 1 >= end)
3         return ;
4     int m = (end - begin) / 2;
5     MergeSort(begin, begin + m);
6     MergeSort(begin + m, end);
7     Merge(begin, begin + m, end);
8 }
 1 //不使用哨兵的版本,需判斷邊界條件
 2 void Merge(int * const first, int * const mid, int * const last) {
 3     vector<int> left(first, mid);
 4     vector<int> right(mid, last);
 5 
 6     int i = 0, j = 0, k = 0;
 7     while (i != left.size() && j != right.size()) {
 8         if (left[i] <= right[j]) {
 9             *(first + k) = left[i++];
10         } else {
11             *(first + k) = right[j++];
12         }
13         ++k;
14     }
15     while (i != left.size()) {
16         *(first + k) = left[i++];
17         ++k;
18     }
19     while (j != right.size()) {
20         *(first + k) = right[j++];
21         ++k;
22     }
23 }
 1 //使用哨兵來簡化代碼
 2 void Merge(int * const first, int * const mid, int * const last) {
 3     vector<int> left(first, mid);
 4     vector<int> right(mid, last);
 5     left.push_back(INT_MAX);       //哨兵INT_MAX必須老是比較中的較大者
 6     right.push_back(INT_MAX);      //即待排序的值必須比INT_MAX小
 7 
 8     int i = 0, j = 0;
 9     for (int k = 0; k < last - first; ++k) {
10         if (left[i] <= right[j]) {
11             *(first + k) = left[i++];
12         } else {
13             *(first + k) = right[j++];
14         }
15     }
16 }
相關文章
相關標籤/搜索