有序子列的归并

void merge(int a[],int temp[],int l,int r,int rightEnd){
	leftEnd=r-1;
	t=l;
	num=rightEnd-l+1;
	while(l<=leftEnd && r<=rightEnd){
		if(a[l]<=a[r]){
		temp[t++]=a[l++];
		}else{
		temp[t++]=a[r++];
		}
	}
	while(l<=leftEnd){
	temp[t++]=a[l++];
	}
	while(r<=rightEnd){
	temp[t++]=a[r++];
	}
	for(int i=0;i<num;i++,rightEnd--){
	a[rightEnd]=temp[rightEnd];
	}
}

注意:(1).子列用完一个元素,指针要加1

(2).temp每次多一个元素,指针要加1

(3).当指针大小超过end,循环跳出

(4).循环跳出要么是r>rightEnd要么是l>leftEnd,不可能同时发生,因为两个数大小不一样,先用完的先跳出

(5).当符合l<=leftEnd但是却跳出循环,无疑是r>rightEnd,此时l左子列还有元素,再把他补进去temp,记得指针要移动,要不无限循环

(6).因为t=l,l的位置一直在变化,并且l不一定是从0开始的,因此从头到尾复制是不可能的,而尾部rightEnd一直不变,我们可以从后到头,循环几次呢,循环num次,如何实现,用 int i=0;i<num;i++ 即可实现循环num次

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值