要定义两个数组,一个用于存数据,一个用于合并时排序,传两个数组、left、right给调用函数,在函数中给定递归的退出条件,一半一半的递归,直至一个数组被拆成每一个单独的数,同时参与合并,a用于存未排好的数,b数组存在一段区域内的排好的数,再将b数组中的数赋进a数组,一个短暂的合并就好了,多个短暂的合并做成一个大合并,排好一组数。程序如下:
#include<stdio.h>
long long int sum;//记录逆序数的个数
long long int funsort(long long int a[],long long int b[],long long int left,long long int mid,long long int right)
{
int i,j,k;
i=k=left;
j=mid+1;
while(i<=mid&&j<=right)
{
if(a[i]>a[j])
{
sum=sum+mid-i+1;
b[k]=a[j];
j++;
k++;
}
else
{
b[k]=a[i];
k++;
i++;
}
}
while(i<=mid)
b[k++]=a[i++];
while(j<=right)
b[k++]=a[j++];
for(i=left;i<k;i++)
a[i]=b[i];
}
long long int fun(long long int a[],long long int b[],long long int left,long long int right)
{
if(left<right)
{
long long int mid=(left+right)/2;
fun(a,b,left,mid);
fun(a,b,mid+1,right);7
funsort(a,b,left,mid,right);
}
}
int main()
{
int t;
scanf("%d",&t); //组数
while(t--)
{
long long int n;//一组数的个数
scanf("%lld",&n);
long long int a[100100],b[100100];//a是输入的数,
long long int i;
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
b[i]=0;
}
sum=0;
fun(a,b,0,n-1);//归并排序
printf("%lld\n",sum);
}
return 0;
}