归并排序

来源:互联网 发布: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
原创粉丝点击