1. 问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2. 解析
二分归并排序采用分治法的思想,将数组先划分再排序。先把这个要排序的数组划分为两份,然后再把子数组再次二分,直到数组的大小为1;然后从最底端开始向上合并,合并的过程对每一个子数组进行排序。
3. 设计
void MergeSort(first,last){//划分
int middle;
if(first<last){
middle=(first+last)/2;
MergeSort(first,middle);
MergeSort(middle+1,last);
Merge(first,middle,last);
}
}
Merge(first,middle,last){
int i=first;
int j=middle+1;
int p=first;
while(i<=middle && j<=last){
if(a[i]>a[j])
newA[p++]=a[j++];
else
newA[p++]=a[i++];
}
while(i!=middle+1)
newA[p++]=a[i++];
while(j!=last+1)
newA[p++]=a[j++];
for(int b=first;b<=last;b++)
a[b]=newA[b];
}
4. 分析
算法复杂度:O(nlog2(n))