int cnt=0; // 逆序對個數
int a[100002], c[100002];
void mergesort(int l, int r) // r=右邊界索引+1
else
c[tmp++] = a[i++];
} if (j
#includeusing namespace std;
/* 歸併求逆序對數, arr 儲存最終有序結果
* 在函式外申請乙個臨時陣列作為引數傳入
* 避免遞迴不斷建立臨時陣列的開銷
*/int merge(int * arr, int beg, int mid, int end, int * tmp_arr)
else
}while(i <= mid)
while(j <= end)
return inversion;}
int mergeinversion(int * arr, int beg, int end, int * tmp_arr)
return inversions;}
/* 測試序列 :answer: 10 */
int testpoint[10] = ;
void main()
逆序對的求法(樹狀陣列)
設a 1.n 是乙個包含n個不同數的陣列,如果在ia j 則 i,j 就稱為a中的乙個逆序對。求法有兩種,一種是歸併排序,一種是樹狀陣列。二者的時間複雜度都是o n logn 但樹狀陣列更加好寫。思路 開乙個樹狀陣列a記錄每乙個數出現的次數。倒序輸入,每輸入乙個數num就在a中加1,同時求一下從0到...
逆序數的求法
求乙個數列的逆序數 逆序對 數列s 1 a 2 a 3 中的任意兩個數s i s j is j 那麼我們就說這兩個數構成了乙個逆序對 逆序數 乙個數列中逆序對的總數 5,4 是乙個逆序對,同樣還有 3,2 5,2 4,2 等等 那麼如何求得乙個數列的逆序數呢?方法1 乙個乙個的數 最簡單也是最容易想...
逆序數的幾種求法
求乙個數列的逆序數 逆序對 數列a 1 a 2 a 3 中的任意兩個數a i a j i,如果a i a j 那麼我們就說這兩個數構成了乙個逆序對 逆序數 乙個數列中逆序對的總數 如數列3 5 4 8 2 6 9 5,4 是乙個逆序對,同樣還有 3,2 5,2 4,2 等等 那麼如何求得乙個數列的逆...