并归排序的算法:http://blog.csdn.net/u013532224/article/details/38538197
#include<stdio.h> //很稳定的 O(log(n)*n) int a[500]={9,4,3,7,3,8,2,4,8}; int tem[500]; int sum; void mergearr(int fir,int mid,int las)// 分治法, 最先合并的是最前面两个数字. { int i=fir,j=mid+1; int n=mid,m=las; int k=0; while(i<=n&&j<=m) { if(a[i]<=a[j])//相等的 不算逆序数 tem[k++]=a[i++]; else { tem[k++]=a[j++]; sum+=mid-i+1; /* i 代表的数组在前面, j 代表的数组在后面; 如果 当前下标为j的数 比较小的话, 那把下标j的数提到前面 , 而i代表的数组中,还没转到tem的数,也就是剩下的数,他们都是大于j的,都和当前的i是逆序数对; */ } } while(i<=n) { tem[k++]=a[i++]; } while(j<=m) { tem[k++]=a[j++]; } for(i=0;fir<=las;) { a[fir++]=tem[i++]; } } int mergesort(int fir,int las)//切开成小段 { int mid; if(fir<las) { mid=(fir+las)/2; sum+=mergesort(fir,mid); sum+=mergesort(mid+1,las); mergearr(fir,mid,las); } return 0; } int main() { int i,n; n=9; sum=0; mergesort(0,8); for(i=0;i<n;i++) { printf("%d\n",a[i]); } printf("逆序数=%d\n",sum); while(1); return 0; }