【模板】归并排序

来源:互联网 发布:英汉互学软件 编辑:程序博客网 时间:2024/06/06 19:05

归并排序求逆序对

#include<iostream>#include<cstdio>#define ll long longusing namespace std;const int N=100010;ll ans=0;int c[N],a[N],n;void Merge(int l,int r){    int num=0;    int mid=(l+r)/2;    int p1=l,p2=mid+1;    while(p1<=mid || p2<=r){        if(p1>mid) {c[++num]=a[p2];p2++;continue;}        if(p2>r) {c[++num]=a[p1];p1++;continue;}        if(a[p1]<=a[p2]) {c[++num]=a[p1];p1++;continue;}        if(a[p1]>a[p2]) {c[++num]=a[p2];ans+=mid-p1+1;p2++;continue;}    }    for(int i=1;i<=num;i++) a[i+l-1]=c[i];}void MergeSort(int l,int r){    if(l<r){        int mid=(l+r)/2;        MergeSort(l,mid);        MergeSort(mid+1,r);        Merge(l,r);    }}int main(){//  freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    MergeSort(1,n);//  for(int i=1;i<=n;i++) printf("%d ",a[i]);    printf("%lld\n",ans);    return 0;}
0 0
原创粉丝点击