这个是归并排序很好例子,下面的代码可以记住,以后碰到归并,可以直接使用了。。。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // INT_MAX
#include <string.h>
#define MAX 500010
int a[MAX];
int L[MAX/2],R[MAX/2];
long long sum;
void MERGE(int* A,int p,int q,int r)
{
int n1,n2,i,j,k;
n1=q-p+1;
n2=r-q;
i=0; j=0;
for(k=p;k<=q;k++) L[i++]=A[k]; // 左部分
L[n1]=INT_MAX;
for(k=q+1;k<=r;k++) R[j++]=A[k]; // 右部分
R[n2]=INT_MAX;
i=0; j=0;
for(k=p;k<=r;k++){ // 归并,递增序列
if(L[i]<=R[j]) {
A[k]=L[i];
i++;
}
else{
sum+=(n1-i);
A[k]=R[j];
j++;
}
}
}
void MergeSort(int* A,int p,int r)
{
int q;
if(p<r){
q=(p+r)/2;
MergeSort(A,p,q);
MergeSort(A,q+1,r);
MERGE(A,p,q,r);
}
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF && n){
sum=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
MergeSort(a,0,n-1);
printf("%lld\n",sum);
}
system("pause");
return 0;
}