归并排序采用分治思想
使用了拆分及合并
将两个有序的序列合并算法如下
void merge(){
int i=1,j=1,k=1;
while(i<=n&&j<=m){
if(a[i]<=b[j])c[k++]=a[i++];
else c[k++]=b[j++];
}
while(i<=n)c[k++]=a[i++];
while(j<=m)c[k++]=b[j++];
}
将两个有序的序列合并到序列c中,复杂度O(n+m)
所以归并排序算法如下
int a[100];//待排序数组
int c[100];//临时存储合并后的数组
void merge(int l,int r){//将已排序的两段区间[l,mid]和[mid+1,r]合并
int mid=(l+r)/2;
int i=l,j=mid+1;
int n=mid,m=r;
int k=l;
while(i<=n&&j<=m){
if(a[i]<=a[j])c[k++]=a[i++];
else c[k++]=a[j++];
}
while(i<=n)c[k++]=a[i++];
while(j<=m)c[k++]=a[j++];
}
void msort(int l,int r){
if(l>=r)return;
int mid=(l+r)/2;
msort(l,mid);//使区间[l,mid]有序
msort(mid+1,r);//使区间[mid+1,r]有序
merge(l,r);//合并使区间[l,r]有序
for(int i=l;i<=r;i++)//将合并后的数组转到a中
a[i]=c[i];
}
拆分采用了二分的方法,复杂度O(logn),所以归并排序算法复杂度为O(nlogn),因为用到了临时数组c保存合并结果,所以空间复杂度为O(n)。