二分归并排序
1.问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
2.解析
二分归并排序是经典的分治算法,分而治之,将长度为n的数组不断划分成n/2的子数组,即将n规模的问题转化成为了n/2规模的子问题,不断划分,当问题规模为1时(长度为1的数组本身就是有序的),将每一个长度为1的子序列进行归并,不断归并就能够实现将长度为n/2的数组归并得到长度为n的数组,实现排序。
3.设计
void merge(int a[],int left ,int middle,int right){
int b[maxn];
int index=0;
int i=left,j=middle+1;
while(i<=middle&&j<=right)
{
if(a[i]<a[j]){
b[index]=a[i];
i++;
index++;
}
else{
b[index]=a[j];
j++;
index++;
}
}
while(i<=middle){
b[index]=a[i];
i++;
index++;
}
while(j<=right){
b[index]=a[j];
j++;
index++;
}
for(int i0=left;i0<=right;++i0){
a[i0]=b[i0-left];
}
}
void mergesort(int a[],int left ,int right)//升序对分
{
if(left>=right)
return;
int middle =(left+right)/2;
mergesort(a,left,middle);//左对分
mergesort(a,middle+1,right);//右对分
merge(a,left,middle,right);//排序
}
4.分析
O(nlogn)