在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數:
如陣列,逆序對總共有5對,,,,,;
這道題可以採用歸併排序的思想來處理:先把陣列分成兩個子串行,統計左半部分逆序對的數目和右半部分逆序對的數目,然後將兩個子串行排序,(避免重複),然後再統計合併在一起時逆序對的數目。加起來就是結果。
例如上面那個例子:先把陣列分解成兩個長度為2的子陣列,再把這兩個子陣列分解成兩個長度為1的子陣列。接下來一邊合併相鄰的子陣列,一邊統計逆序對的數目。在第一對長度為1的子陣列、中7>5,因此(7,5)組成乙個逆序對。同樣在第二對長度為1的子陣列,中也有逆序對(6,4),由於已經統計了這兩對子陣列內部的逆序對,因此需要把這兩對子陣列進行排序,避免在之後的統計過程中重複統計。
逆序對的總數=左邊陣列中的逆序對的數量+右邊陣列中逆序對的數量+左右結合成新的順序陣列時中出現的逆序對的數量;
其實整個過程就是歸併排序的思想。
**如下:
//陣列中的逆序對
public
static
int inversepairs(int array)
return mergecount(array, copy, 0, array.length-1);
}public
static
int mergecount(int array, int copy, int start, int end)
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)else
}for(;i>=start;i--)
for(;j>=mid+1;j--)
return leftcount+rightcount+count;
}
歸併排序求陣列中的逆序對
描述 測試說明與提交 提交狀態 題目設定 給定一組數,其中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。首先輸入資料組數t 1 t 100 每組測試資料報括兩行 第一行包含乙個整數n,表示陣列中的元素個數。其中1 n 10 5。第...
陣列中的逆序對(歸併排序)
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。在歸併排序的一次merge中,r j 1 法一 統計i的逆序數 int merge int a,int p,int q,int r int n1 q p 1,n2 r q in...
陣列中的逆序對(歸併排序)
題目 陣列中的逆序對 思路 典型的歸併排序 很好的題目 這是乙個歸併排序的合併過程,主要考慮合併兩個有序序列時,計算逆序對的個數!對於兩個公升序序列,設定兩個下標 前下標和後下標 初始化為前序列第乙個數字的下標和後序列第乙個數字的下標。如果前下標對應的值大於後下標對應的值,則有 前序列剩下的長度 個...