归并排序和快排效率差不多,当求逆序对的个数时可以使用归并排序
#include<iostream>
#include<algorithm>
using namespace std;
int a[10000002];
int b[10000002];
int n;
long long ans;
void merge_sort(int l,int r)
{
if(l==r)
return;
int mid=(l+r)/2,i=l,k=l,j=mid+1;
merge_sort(l,mid);
merge_sort(mid+1,r);
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
{
ans+=mid-i+1;
b[k++]=a[j++];
}
}
while(i<=mid)
b[k++]=a[i++];
while(j<=r)
b[k++]=a[j++];
for(i=l;i<=r;i++)
a[i]=b[i];
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
merge_sort(0,n-1);
cout<<ans;
return 0;
}