劍指offer,計算逆序數,java
阿新 • • 發佈:2019-01-06
題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 public class test { public static void main(String[] args) { int[] array = {1,2,3,4,5,6,7,0}; test test = new test(); int i = test.InversePairs(array); for(int a:array){ System.out.println(a); } System.out.println(i); } public static int count = 0;//設定全域性變數來記錄逆序個數 public int InversePairs(int [] array) { if(array.length == 0){ return 0; } int [] temp = new int[array.length];//在排序前,先建好一個長度等於原陣列長度的臨時陣列,避免遞迴中頻繁開闢空間 return Sort(array,0,array.length-1,temp)%1000000007; } private int Sort(int [] arry,int start, int end,int [] temp){ if(start >= end) return 0; int mid = (start+end)/2; Sort(arry,start,mid,temp); Sort(arry,mid+1,end,temp); return Merge(arry,start,mid,end,temp); } private int Merge(int [] array, int left,int mid, int right, int[] temp){ int temp1 = left; int temp2 = mid+1; int temp3 = 0; while (temp1 <= mid && temp2 <= right){ if(array[temp1] <= array[temp2]){ temp[temp3++] = array[temp1++]; }else { temp[temp3++] = array[temp2++]; count += temp2-temp1-1; } } while (temp1<=mid){ temp[temp3++] = array[temp1++]; } while (temp2<=right){ temp[temp3++] = array[temp2++]; } //將temp中的元素全部拷貝到原陣列中(要注意使用的是left和t,不能搞混了t和left) int i = 0; while (left<=right){ array[left++] = temp[i++]; } return count; } }