第三章 :查詢與排序-------3.7分治模式的完美詮釋_歸併排序

Curtis_發表於2019-03-09

分治模式的完美詮釋_歸併排序

 思路:

//思路:
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迴圈放入原陣列。

相關文章