归并排序

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

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

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值