排序---归并排序

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]

猜你喜欢

转载自www.cnblogs.com/iwangzhengchao/p/9950550.html