这里并不打算详细讲解原理,拿某位大佬做的动图看一下,https://www.cnblogs.com/fivestudy/p/10064969.html
简单讲,就是不断把两个排好序的数组再合为一个有序的数组,这个应该不难理解,貌似以前C语言学到数组的时候就讲过了。
逆序对概念:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。
如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。
#include<iostream>
#include<cstdio>
using namespace std;
int a[500010],b[500010],n;
long long ans;
void mergeSort(int l,int r)
{
if(l==r)return;
int i=l,mid=(l+r)/2,j=mid+1,k=l;
mergeSort(l,mid);
mergeSort(mid+1,r);
while(i<=mid&&j<=r)
{
if(a[i]<=a[j]){
b[k++]=a[i++];
}
else{
ans=ans+j-k;
b[k++]=a[j++];
}
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int i=l;i<=r;i++)
a[i]=b[i];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
mergeSort(1,n);
cout<<ans;
return 0;
}