劍指Offer第36題—Java版

本題使用歸併排序的思想,結合歸併排序,寫出的算法解。

//數組中的逆序對
public static int InversePairs(int[] array){
    if(array==null||array.length<=1)
        return 0;
    int[] copy = new int[array.length];
    //複製原數組
    copy = Arrays.copyOf(array, array.length);
    return mergeCount(array, copy, 0, array.length-1);
}

public static int mergeCount(int[] array, int[] copy, int start, int end){
    if(start==end){
        copy[start] = array[start];
        return 0;
    }
    int mid = (start+end)>>1;
    int leftCount = mergeCount(copy, array, start, mid);
    int rightCount = mergeCount(copy, array, mid+1, end);
    
    //計算兩個已經求解好的數組的逆序對
    int i = mid;//i初始化爲前半段最後一個數字的下標
    int j = end;//j初始化爲後半段最後一個數字的下標
    //作爲複製到臨時數組的下標
    int index = end;//輔助數組複製的數組的最後一個數字的下標
    //計算兩個數組在合併過程中的逆序對數
    int count = 0;//計數--逆序對的數目
    while(i>=start&&j>=mid+1){
        if(array[i]>array[j]){
        	//copy數組存放排序好的數,
            copy[index--] = array[i--];
            count += j-mid;
        }else{
            copy[index--] = array[j--];
        }
    }
    //把左邊剩下的放到copy數組
    for(;i>=start;i--){
        copy[index--] = array[i];
    }
    //把右邊剩下的放到copy數組
    for(;j>=mid+1;j--){
        copy[index--] = array[j];
    }
    //返回的是某一邊的數
    return leftCount+rightCount+count;
}


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