题目:
在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。
输入一个数组,求出这个数组中的逆序对的总数。
解答:
1 public class Solution { 2 public static void main(String[] args) { 3 int[] arr = {7,5,6,4}; 4 System.out.println(getInversePairs(arr)); 5 } 6 7 private static int getInversePairs(int[] arr) { 8 if(arr == null) { 9 return 0; 10 } 11 12 int[] clone = arr.clone(); 13 return mergeSort(arr, clone, 0, arr.length-1); 14 } 15 16 private static int mergeSort(int[] array, int[] result, int start, int end) { 17 if(start == end) { 18 result[start] = array[end]; 19 return 0; 20 } 21 22 int length = (end-start) >> 1; 23 int left = mergeSort(array, result,start, start+length); 24 int right = mergeSort(array, result, start+length+1, end); 25 int leftIndex = start+length; 26 int rightIndex = end; 27 int count = 0; 28 29 int point = rightIndex; 30 31 while(leftIndex >= start && rightIndex >= start+length+1) { 32 if(array[leftIndex] > array[rightIndex]) { 33 result[point--] = array[leftIndex--]; 34 count = count + rightIndex-(start+length); 35 } else { 36 result[point--] = array[rightIndex--]; 37 } 38 } 39 40 for(int i = leftIndex; i >= start; i--) { 41 result[point--] = array[i]; 42 } 43 44 for(int j = rightIndex; j >= start+length+1; j--) { 45 result[point--] = array[j]; 46 } 47 48 return left+right+count; 49 50 } 51 }