【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步