有序子列的归并

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次

猜你喜欢

转载自blog.csdn.net/HZPHYT/article/details/82731340