归并排序
来源:互联网 发布:qq直播是什么软件 编辑:程序博客网 时间:2024/06/07 15:10
归并排序算法心得
归并排序算法有递归归并排序算法和非递归排序算法两种,每种自由的特点各有不同。
非递归的归并排序
首先分析非递归归并排序算法:它本身有的特点是总排序次数是n/2取上界。
原因:假设数组的长度是5,取下界得到的值是2,那么第二次只能排序前面4个数字,第五个则不会进行排序。这样会使得漏排~~~
解决了排序次数问题,接下来分析如何进行数组的一次归并,根据每次自定义数组长度进行归并,第一次把每个数组看作是长度为1的集合。那么进行多次之后会使得长度达到本来数组长度。ps:arry[5]
对于归并每次归并都是两两互相归并,如果留出单独的则不进行特殊处理。
有一个问题,对于每次归并的不可能两个数组长度都是相等的,所以我们在理想化处理的同时需要对特殊的情况进行处理。下面是处理代码。
int Sort::MergePass2(int r[], int len, int length){int i = 0;for(i = 0; i+2*len-1 < length; i = i+2*len){Merge2(r, i, i+len-1, i+2*len-1);}if(i+len < length){Merge2(r, i, i+len-1, length-1);}return 0;}
总结一下:如果待排序数组集合是个奇数不会进入到特殊处理,如果是个偶数则可能进行特殊处理。
以上就是对非递归的归并排序进行的简要总结。
递归的归并排序
对于一个待归并数组,我们可以进行这样考虑,把数组规模缩小化即考虑数组长度为2的情况,之后进行扩展可以考虑到数组长度为n的情况也就迎刃而解了。
下面是处理的核心源代码。
int Sort::MergeRecursive(int r[], int length){int* t = new int[length];MergeRecursive2(r, t, 0, length-1);delete[] t;return 0;}int Sort::MergeRecursive2(int r[], int t[], int s, int e){cout << endl;cout << endl;int mid = 0;if(s == e){t[s] = r[s];}else{mid = (s+e)/2;MergeRecursive2(r, t, s, mid);MergeRecursive2(r, t, mid+1, e);Merge2(t, s, mid, e);for(int i = s; i <= e; ++i){r[i] = t[i];}}return 0;}
至此对于递归的归并排序总结到这里,可能一次不能理解意思,如果想懂就多读,相信你会理解的。
后续上传各类详细排序代码
--->Copyright @Kindy之家
转载请注明地址
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 单链表C++类模板实现
- Mysql Oracle Java 数据类型对照
- Effective C++条款26解读: 尽可能延后变量定义式的出现时间
- 在VS2010下MFC采用ADO方式连接ACCESS数据库(详细过程)
- 学习笔记(objective-c)-协议(protocol)
- 归并排序
- android新建程序时出现Errors occurred during the build
- APMServ5.2.6安装PHP框架Yii2详细教程
- 黑马程序员——java基础——IO流(二)
- leetcode - Longest Palindromic Substring
- 算法竞赛入门经典之stl重的常用数据结构----->set
- Linux查看CPU信息 (
- 不要做浮躁的嵌入式系统工程师
- 学习laravel5,Win7安装Composer-Setup.exe,出错ERR_CONNECTION:Unable to connect to getcomposer.org