归并排序求逆序对 模板题
归并排序主要是二路归并排序,采用分治的思想:对于某个数组a[n]排序,先将前半部分排序,再将后半部分排序,最后归并两部分。归并排序是一种稳定的排序方式,且时间复杂度为O(n*log2n)。归并排序还可以求一串数中的逆序数。在归并相邻的两个有序子数组:
#include "stdio.h"
#include "string.h"
int a[500010];
int swap[500010];
__int64 ans;
void merge(int l,int mid,int r)
{
int i,j,m;
i=l;
j=mid+1;
m=0;
while (i<=mid && j<=r)
{
if (a[i]<=a[j])
{
swap[m++]=a[i];
i++;
}
else
{
swap[m++]=a[j];
j++;
ans+=mid-i+1;
}
}
while (i<=mid)
swap[m++]=a[i++];
while (j<=r)
swap[m++]=a[j++];
for (i=0;i<m;i++)
a[l+i]=swap[i];
}
void mergesort(int l,int r)
{
int mid;
if (l<r)
{
mid=(l+r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,mid,r);
}
}
int main()
{
int i,n;
while (scanf("%d",&n)!=EOF)
{
if (n==0) break;
ans=0;
for (i=0;i<n;i++)
scanf("%d",&a[i]);
mergesort(0,n-1);
printf("%I64d\n",ans);
}
return 0;
}