1.问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2.解析
二分归并排序算法
算法步骤如下:
(1) 分解:分解待排序的n个元素的数组成各具n/2个元素的两个子数组。
(2) 解决:使用归并排序递归地排序两个子序列。
(3) 合并:合并两个已排序的子序列以产生排序的答案。
如图所示:
3.设计
void Merge(int a[],int start,int mid,int end){
int i=start,j=mid+1,k=start;
while(i<=mid&&j<=end){
if(a[i]>a[j])
t[k++]=a[j++];
else
t[k++]=a[i++];
}
while(i<=mid)t[k++]=a[i++];
while(j<=end)t[k++]=a[j++];
for(int m=start;m<=end;m++)
a[m]=t[m];
}
void MergeSort(int a[],int start,int end){
int mid=(start+end)/2;
if(start<end){
MergeSort(a,start,mid);
MergeSort(a,mid+1,end);
Merge(a,start,mid,end);
}
}
4.分析
平均复杂度为O(nlogn)
5.源码
https://github.com/Chenzh0205/Algorithm/tree/main/%E4%BD%9C%E4%B8%9A4