题目链接:传送门
归并排序,时间复杂度为O(n)
冒泡排序也可以一个个查,但效率太低
归并排序的时候每出现一次逆序就算进去
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 50010
int a[N],b[N];
int ans=0;
void Merge(int l,int m,int r){
int i=l,j=m+1,k=l;
while(i<=m&&j<=r){
if(a[i]<=a[j])
b[k++]=a[i++];
else{
b[k++]=a[j++];
ans+=m-i+1;
}
}
if(i<=m) while(i<=m) b[k++]=a[i++];
else while(j<=r) b[k++]=a[j++];
for(int n=l;n<=r;n++)
a[n]=b[n];
}
void merge(int l,int r){
int i,j,m,n;
if(l<r){
int m=(l+r)/2;
merge(l,m);
merge(m+1,r);
Merge(l,m,r);
}
}
int main(){
int i,j,n,m,k;
while(scanf("%d",&n)!=EOF){
ans=0;
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
cin>>a[i];
merge(1,n);
cout<<ans<<endl;
}
return 0;
}