本題使用歸併排序的思想,結合歸併排序,寫出的算法解。
//數組中的逆序對
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;
}