归并排序

归并排序算法心得

归并排序算法有递归归并排序算法和非递归排序算法两种,每种自由的特点各有不同。

非递归的归并排序

首先分析非递归归并排序算法:它本身有的特点是总排序次数是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值