【数据结构】【归并排序】

萝らか妹 提交于 2019-12-17 09:18:06
#include<bits/stdc++.h>
using namespace std;
int k,n,ans=0;
int a[500100],b[500100];
void merge_sort(int l,int r) {
    if(l==r)return ;//一个数不用排
    int m=(l+r)>>1;
    merge_sort(l,m);
    merge_sort(m+1,r);
    int i=l,j=m+1,k=0;//i左边最小位置,j右边最小位置
    while(i<=m&&j<=r)
        if(a[i]<=a[j])b[++k]=a[i++];
        else ans+=m-i+1,b[++k]=a[j++];//加入右半段时,逆序对数增加
    while(i<=m)b[++k]=a[i++];//加入左边剩余的数
    while(j<=r)b[++k]=a[j++];//加入右边剩余的数
    for(i=1; i<=k; i++)a[l+i-1]=b[i];
}
int main() {

        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        merge_sort(1,n);
        for(int i=1;i<=n;i++)
        printf("%d ",b[i]);

    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!