归并排序的分治策略如下:
(1)划分:将待排序序列从中间位置划分为两个长度相等的子序列
(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列
(3)合并:将这两个有序子序列合并成一个有序序列
void Merge(int r[],int begin,int middle,int end){
int r1[end+1];
int i = begin,j = middle+1,k = begin;
while(i<=middle && j<=end){
if(r[i] <= r[j]) r1[k++] = r[i++];
else r1[k++] = r[j++];
}
while(i <= middle) r1[k++] = r[i++];
while(j <= end) r1[k++] = r[j++];
for(i=begin;i<=end;i++) r[i] = r1[i];
}
void MergeSort(int r[],int begin,int end){
if(begin == end) return;
int middle = (begin + end)/2;
MergeSort(r,begin,middle);//归并前半个子序列
MergeSort(r,middle+1,end);//归并后半个子序列
Merge(r,begin,middle,end);//合并
}
测试如下
int main(){
int r[10] = {1,6,8,9,7,3,10,2,5,4};//测试
cout<<"排序前:";for(int i=0;i<10;i++) cout<<r[i]<<" ";cout<<endl;
MergeSort(r,0,9);
cout<<"排序后:";for(int i=0;i<10;i++) cout<<r[i]<<" ";cout<<endl;
return 0;
}
输出如下:
排序前:1 6 8 9 7 3 10 2 5 4
排序后:1 2 3 4 5 6 7 8 9 10