分治模式的完美诠释_归并排序
思路:
//思路:
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循环放入原数组。