归并排序解决逆序对问题

#include 
#include 
#include 
#define INF 2147483647
using namespace std;
int n,num[500005],L[250005],R[250005];
long long ans=0;
void myMerge(int l,int r,int m)//l-m  m+1-r
{
     
    int n1=m-l+1,n2=r-m;
    for(int i=0;i<n1;i++)L[i]=num[i+l];
    for(int j=0;j<n2;j++)R[j]=num[j+m+1];
    int i=0,j=0;
    L[n1]=R[n2]=INF;
    for(int k=l;k<=r;k++)
    {
     
        if(L[i]>R[j])
           {
     
              ans+=n1-i;
              num[k]=R[j++];
           }
        else num[k]=L[i++];
    }
}
void merge_sort(int l,int r)
{
     
    if(l<r)//加了等号会死循环
    {
     
        int m=(l+r)/2;
        merge_sort(l,m);
        merge_sort(m+1,r);
        myMerge(l,r,m);
    }
}
int main()
{
     
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    merge_sort(1,n);
    printf("%lld",ans);
    return 0;
}

你可能感兴趣的:(洛谷题解,排序,算法)