#include<cstdio>
int a[600000],temp[600000],n;
long long sum;//结果可能很大
void mergeArray(int l,int r)//归并
{
int lStart = l,lEnd = (l+r)/2,
rStart = (l+r)/2+1,rEnd = r,
i1 = 0;
while(lStart<=lEnd&&rStart<=rEnd)
{
if(a[lStart]<=a[rStart])
{
temp[i1] = a[lStart];
lStart++;
i1++;
}
else
{
sum+=(long long)(lEnd-lStart+1);//求逆序数
temp[i1] = a[rStart];
rStart++;
i1++;
}
}
for(int i=lStart;i<=lEnd;i++)
{
temp[i1] = a[i];
i1++;
}
for(int i=rStart;i<=rEnd;i++)
{
temp[i1] = a[i];
i1++;
}
for(int i=l;i<=r;i++)
a[i] = temp[i-l];
}
void mergeSort(int l,int r)//二分
{
if(l<r)
{
mergeSort(l,(r+l)/2);
mergeSort((r+l)/2+1,r);
mergeArray(l,r);
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
sum = 0;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
mergeSort(0,n-1);
printf("%I64d\n",sum);
}
return 0;
}
poj 2299 Ultra-QuickSort 归并排序(求逆序数模板)
最新推荐文章于 2021-10-09 14:23:30 发布
本文介绍了一种利用归并排序算法计算数组中逆序数的方法。通过递归地将数组分为两部分,分别排序后再进行合并,并在合并过程中统计逆序数。适用于需要高效计算逆序数的场景。

408

被折叠的 条评论
为什么被折叠?



