归并排序

归并排序采用分治思想
使用了拆分及合并

将两个有序的序列合并算法如下

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=1;
    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-l+1];
}

拆分采用了二分的方法,复杂度O(logn),所以归并排序算法复杂度为O(nlogn),因为用到了临时数组c保存合并结果,所以空间复杂度为O(n)。

你可能感兴趣的:(归并排序)