逆序對問題(歸併排序解法)

逆序對問題 在一個數組中,左邊的數如果比右邊的數大,則這兩個數構成一個逆序對,請打印所有逆序對。

解題思路同第一題完全相同,區別在於要找的是左邊大的,也就是p[0] > p[1]時,打印兩數組成的tuple.代碼如下:

public class ReversePairs {
    public static void reversePairs(int [] arr) {
        if (arr.length < 2 && arr == null){ return; }
        reversePairs(arr,0,arr.length - 1);
    }

    public static void reversePairs(int [] arr, int l, int r){

        if(l == r) { return; }
        int mid = l + ((r - l) >> 1);
        reversePairs(arr,l,mid);
        reversePairs(arr,mid + 1,r);
        merge(arr,l,mid,r);
    }

    public static void merge(int [] arr, int l, int m, int r){
        int [] temp = new int [r - l + 1];
        int i = 0;
        int p0 = l;
        int p1 = m + 1;

        while(p0 <= m && p1 <= r) {
            if (arr[p0] > arr[p1]){
                System.out.println("( " + arr[p0] + " " + arr[p1] + " )");
            }
            temp[i++] = arr[p0] > arr[p1] ? arr[p0++] : arr[p1++];
        }
        while (p0 <= m){
            temp[i++] = arr[p0++];
        }
        while (p1 <= r){
            temp[i++] = arr[p1++];
        }
        for (i = 0; i < temp.length; i++){
            arr[l + i] = temp[i];
        }
    }
}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章