多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】12.十大排序算法——归并排序

参考资料

 归并排序https://zhuanlan.zhihu.com/p/417625111

归并排序算法详解https://blog.csdn.net/qq_35344198/article/details/106857042

 

直观理解

合并有序集合A和B是容易的,只需要不停地比较A.Top和B.Top并取走较小/大的一个元素即可(可能出现蛇形走位),但问题是如何将一个无序集合切割为2个有序的集合。

1切割,逐层向下使用二分切割,直到切到子集合中仅剩一个元素;

2使子集合有序,当子集合A只有一个元素时它自己自然可以认为是有序的,这时将它与同级的另一个子集合B(B的子元素数量不会超过2,且已经排序过)进行合并,可以视作两个有序集合的合并,easy;

3合并子集合,逐层向上合并得到最终结果

 

例子先行

 

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 void MergeSort(vector<int>& array,int start,int end);
 6 void Merge(vector<int>& array, int start, int mid, int end);
 7 
 8 //程序入口
 9 int main()
10 {
11     vector<int> arr{5,4,3,2,1};
12     int dataLen = arr.size();
13     
14     //归并排序
15     MergeSort(arr, 0, dataLen - 1);
16 
17     //输出验证
18     for(int val:arr){
19         cout<<val<<endl;
20     }
21 
22     return 0;
23 }
24 
25 //默认排为升序
26 void MergeSort(vector<int>& array,int start,int end)
27 {
28     if(start >= end){
29         return;
30     }
31     
32     int mid = start + (end - start)/2;
33     MergeSort(array, start, mid);
34     MergeSort(array, mid + 1,end);
35     Merge(array, start, mid, end);
36 }
37 
38 //合并
39 void Merge(vector<int>& array, int start, int mid, int end){    
40     //中间变量
41     int i = start, j = mid + 1;
42     vector<int> temp;
43     
44     //逐个比较
45     while(i <= mid && j <= end){
46         if(array[i] <= array[j]){
47             temp.push_back(array[i++]);
48         }
49         else{
50             temp.push_back(array[j++]);
51         }
52     }
53     
54     //i有剩余
55     while(i <= mid){
56         temp.push_back(array[i++]);
57     }
58     
59     //j有剩余
60     while(j <= end){
61         temp.push_back(array[j++]);
62     }
63     
64     //复制回array中
65     for(int cur = 0; cur < temp.size(); cur++){
66         array[start + cur] = temp[cur];
67     }
68 }
复制代码

 

总结提炼

 注意研习参考资料中对时空复杂度、稳定性的分析

时间复杂度O(nlogn)

空间复杂度O(n),因为用到了辅助空间

没有前后交换的情况,是稳定的排序

 

拓展方向

暂无

本文作者:啊原来是这样呀

本文链接:https://www.cnblogs.com/OhOfCourse/p/16917628.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起