1. 程式人生 > >排序---歸併排序

排序---歸併排序

1.  歸併排序

歸併排序(Merge sort),是建立在歸併操作上的一種有效的排序演算法,效率為{\displaystyle O(n\log n)}。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞迴可以同時進行。【詳情見維基百科

歸併排序
Merge-sort-example-300px.gif
分類 排序演算法
資料結構 陣列
最壞時間複雜度 \Theta (n\log n)
最優時間複雜度 \Theta (n\log n)
平均時間複雜度 \Theta (n\log n)
最壞空間複雜度 \Theta(n)

2. 歸併排序(非遞迴版)C++ 實現

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 
 5 void MergeSort(vector<int> &array){
 6     int len = array.size();
 7     vector<int> temp(len);
 8 
 9     for(int seg = 1; seg <= len; seg = 2 * seg){
10         // 將array中相鄰長度為seg的子序列兩兩歸併到temp
11 for(int start = 0; start <= len; start = start + 2 * seg){ 12 // 確定歸併範圍 low, mid, high 13 int low = start; 14 int mid = min(len - 1, start + seg - 1); 15 int high = min(len - 1, start + 2 * seg - 1); 16 17 int start1 = low, end1 = mid;
18 int start2 = mid+1, end2 = high; 19 int idx = low; 20 21 // 將array[low...mid]和array[mid+1...high]歸併到temp[low...high] 22 while(start1 <= end1 && start2 <= end2) 23 temp[idx++] = array[start1] < array[start2]? array[start1++] : array[start2++]; 24 while(start1 <= end1) 25 temp[idx++] = array[start1++]; 26 while(start2 <= end2) 27 temp[idx++] = array[start2++]; 28 } 29 // 將temp賦值給array,從新進行下一輪 30 int i = 0; 31 for(vector<int>::iterator it = temp.begin(); it != temp.end(); it++){ 32 array[i++] = *it; 33 } 34 } 35 } 36 37 bool Check(vector<int> arr){ 38 bool flag = true; 39 for(int i=1; i<arr.size(); i++) 40 flag = flag && (arr[i]-arr[i-1] >= 0); 41 return flag; 42 } 43 44 int main(int argc, char const *argv[]) 45 { 46 vector<int> arr = {5, 9, 0, 1, 3, 6, 4, 8, 2, 7}; 47 48 MergeSort(arr); 49 for(auto &it : arr) 50 cout<<it<<' '; 51 cout<<endl; 52 53 // 判斷返回結果的正確性 54 bool isInOrder = Check(arr); 55 if (isInOrder) 56 cout<<"true"<<endl; 57 else 58 cout<<"false"<<endl; 59 return 0; 60 }

 3. 執行結果

0 1 2 3 4 5 6 7 8 9 
true
[Finished in 1.4s]