归并排序算法心得
归并排序算法有递归归并排序算法和非递归排序算法两种,每种自由的特点各有不同。
非递归的归并排序
首先分析非递归归并排序算法:它本身有的特点是总排序次数是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之家
转载请注明地址