逆序对:
设A[1...n]是一个包含n个不同数的数组。如果在i〈j的情况下,有A[i]〉A[j],则(i,j)就称为A中的一个逆序对(inversion)。
#include <stdio.h>
int sum = 0;
void merge(int *arr, int left, int middle, int right)
{
int i,j,k;
int m=middle-left+1;
int n=right-middle;
int a[100],b[100];
for(i=0;i<m;i++)
a[i]=arr[left+i];
for(j=0;j<n;j++)
b[j]=arr[middle+j+1];
a[m]=100;
b[n]=100;
i=0;
j=0;
for(k=left;k<=right;k++)
if(a[i]<b[j])
arr[k]=a[i++];
else{
arr[k]=b[j++];
sum+=middle-(left+i)+1;
}
}
void mergesort(int *arr,int left,int right){
int middle=(left+right)/2;
if(left<right){
mergesort(arr,left,middle);
mergesort(arr,middle+1,right);
merge(arr,left,middle,right);
}
}
//测试:
int main()
{
int i;
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int len=sizeof(arr)/sizeof(int);
mergesort(arr, 0, len-1);
printf("%d\n", sum);
for (i = 0; i<len; i++)
printf("%d ", arr[i]);
return 0;
}