1. 程式人生 > >劍指offer,計算逆序數,java

劍指offer,計算逆序數,java

題目描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數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;
    }
}