第三章 :查找与排序-------3.7分治模式的完美诠释_归并排序

分治模式的完美诠释_归并排序

 思路:

//思路:
void sort(int arr[],int low, int high){
	if(low<high){
		int middle=low+((high-low)>>1);
		sort(arr,low,middle);// 对左侧进行排序
		sort(arr,middle+1,high);//对右侧进行排序
		merge(arr,low,middle,high);//合并 
	}	
} 
//伪代码:

MergeSort:
	
	mergeSort(A,p,r){
		if(p<r){
			mid=p+((r-p)>>1);
			mergeSort(A,p,mid);
			mergeSort(A,mid+1,r);
			merge(A,p,mid,r);
		}
	}
	
	helper=[A.length];

        //二路归并:
	merge(A,p,mid,r){
		//先把A中的数据拷贝到helper中 
		copy(A,p,helper,p,r-p+1);
		left=p; //左侧队伍的头部指针,指向待比较的元素
		right=mid+1;//右侧队伍的头部指针,指向待比较的元素
		current=p; //原数组的指针,指向待填入数据的位置
		
		while(left<=mid&&right<=r){
			if(helper[left]<=helper[right]){
				A[current]=helper[left];
				current++;
				left++;
			}
			else{
				A[current]=helper[right];
				current++;
				right++;
			}
		} 
		
		while(left<=mid){
			A[current]=helper[left];
			current++;
			left++;
		}
		
	}
	 

将原数组拷贝,二路进行比较,小的放回原数组(依次)。

最后,若右侧那一路没放完,不需要管。

           若左侧那一路没放完,while循环放入原数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值