#include <iostream>
#include <algorithm>
#define maxn 100005
using namespace std;
int A[maxn];
int n;
int sum=0; //逆序对个数
void Merge(int A[],int left,int leftend,int right)
{
int rightpos=leftend+1;
int leftpos=left;
while(leftpos<=leftend&&rightpos<=right)
{
if(A[leftpos]<=A[rightpos]) leftpos++;
else
{
sum+=(leftend-leftpos+1);
rightpos++;
}
}
sort(A+left,A+right+1);
}
void mergesort(int A[],int left,int right)
{
if(left<right)
{
int center=(left+right)>>1;
mergesort(A,left,center);
mergesort(A,center+1,right);
Merge(A,left,center,right);
}
return ;
}
void Mergesort(int A[])
{
mergesort(A,0,n-1);
return ;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>A[i];
Mergesort(A);
cout<<sum<<endl;
return 0;
}
求逆序对--归并排序
最新推荐文章于 2022-06-27 14:37:54 发布