static int inversePairs(int[] A,int left,int right){ if(right<left) return 0 ; int mid = (left + right)/2; int inverseCnt = 0; if(mid>left){ inverseCnt += inversePairs(A,left,mid); } if(mid+1<right){ inverseCnt += inversePairs(A,mid+1,right); } //merge the two parts int i1=left; int i2=mid+1; int i3=0;; int[] tmp = new int[right-left+1]; while(i1<=mid && i2<=right){ if(A[i1]>A[i2]){ //inverse found, print out //inverseCnt += mid - i1 + 1; for(int i=i1;i<=mid;i++) { inverseCnt ++; System.out.println(A[i] +" " + A[i2]); } tmp[i3++] = A[i2++]; }else{ tmp[i3++] = A[i1++]; } } if(i1<=mid){ for(int i=i1;i<=mid;i++) tmp[i3++] = A[i]; }else if(i2<=right){ for(int i=i2;i<=right;i++) tmp[i3++] = A[i]; } for(int i=0,j=left+i;i<i3;i++,j++){ A[j] = tmp[i]; } return inverseCnt; } 例如序列(3,0,4,5,1,2)的逆序对有7个:(3,0), (5,1), (5,2), (3,1), (4,1), (3,2), (4,2)。归并算法时间平均复杂度为O(nlogn), 比简单的算法O(n^2)效率高。