归并排序求逆序对

时间:2021-04-10 09:50:27

关键是cnt+=m-p 

其余和归并排序一模一样。


#include<cstdio>

#include<iostream>
#include<cstring>
using namespace std;

int a[111111],t[111111],n,cnt;

void merge(int *A,int x,int y,int *T)
{
    if (y-x>1)
    {
        int m=x+(y-x)/2;
        int p=x,q=m,i=x;
        merge(A,x,m,T);
        merge(A,m,y,T);
        while (p<m||q<y)
        {
            if (q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++];
            else T[i++]=A[q++],cnt+=m-p;
        }
        for (int i=x;i<y;i++) A[i]=T[i];
    }
}

int main()
{
    scanf("%d",&n);cnt=0;
    memset(a,0,sizeof(a));
    memset(t,0,sizeof(t));
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    merge(a,1,n+1,t);
    for (int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("%d",cnt);
}