您的位置:首页 > 其它

归并排序求逆序对

2016-12-12 16:10 169 查看
#include <iostream>
using namespace std;
const int maxn = 100000+10;
int a[maxn],t[maxn];long long ans=0;
void merge_sort(int l,int r)
{
if(l==r) return;
int m=(l+r)/2;
merge_sort(l,m);
merge_sort(m+1,r);
int i=l,j=m+1,k=l;
while(i<=m&&j<=r)
{
if(a[i]>a[j])
{
t[k++]=a[j++];
ans+=m-i+1;//求逆序对
}
else
{
t[k++]=a[i++];
}
}
while(i<=m) t[k++]=a[i++];
while(j<=r) t[k++]=a[j++];
for(i=l;i<=r;i++) a[i]=t[i];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
merge_sort(1,n);
cout<<ans;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序