逆序對計數問題

2021-10-09 00:08:41 字數 1122 閱讀 1865

問題描述:統計乙個陣列中共有多少個逆序對

輸入

第一行乙個整數n,第二行n個整數

輸出

這n個數構成的陣列中逆序對的總數

解題思路

如果用蠻力列舉法,則對每個a[i],列舉j(j>i),並統計逆序對數目

參考如下**:

int countinver

(int a[

],int n)

平均時間複雜度為o(n^2)

採用分而治之的思想:將陣列一分為二,遞迴求解子陣列的逆序對,再合併問題解,關鍵在於求解跨越子陣列的逆序對數目,

可以採用直接求解,或先排序再進行二分查詢求解,平均時間複雜度分別為o(n

2),o

(n(l

ogn)

2)

o(n^2) ,o(n(logn)^2)

o(n2),

o(n(

logn

)2)相比蠻力列舉效率變化不大還是很低,致因在於我們沒有將排序過程融入整個演算法框架,為了解決這個問題,我們可以採用歸併排序,那麼統計逆序對問題的整個演算法就和歸併排序相似,只是稍加改變

參考**如下:

int mergecount

(int a[

],int left,int mid,int right)

;int countinver

(int a[

],int left,int right)

}

int mergecount

(int a[

],int left,int mid,int right)

if(i<=mid)

while

(i<=mid) a[k++

]=b[i++];

if(j<=right)

while

(j<=right) a[k++

]=b[j++];

return s;

}

平均時間複雜度為:o(nlogn)

☞歸併排序

分而治之 逆序對計數問題

問題 輸入乙個長度長度為n的陣列a n 求出陣列a n 逆序對的總數。輸入 長度為n的陣列a n 輸出 陣列a n 逆序對的總數 把陣列a二分為兩個子陣列a 1 n 2 a n 2 1 n 遞迴求解子問題 求解s1 僅在a 1 n 2 中的逆序對數目 求解s2 僅在a n 2 1 n 中的逆序對數目...

逆序數計數問題

逆序數問題的形化表示 輸入 一組n個不同的數的序列a n 輸入 逆序數對數記為 num,如果 i j 而 a i a j 那麼就是逆序數對 逆序數技術問題是排序演算法的某種變形。方法一 暴力破解法 類似於氣泡排序 思路 列舉出所有的陣列對,一共有 n n 1 2 對,判斷這些是否為逆序數對數。時間複...

逆序對計數

逆序對計數 問題描述 對於給定的陣列a,計算其逆序對的總數。即 image.png 輸入形式 輸入包含1組測試用例。乙個測試用例佔一行,第乙個整數表示陣列的長度,後面緊跟者陣列中的各個整數元素,中間都用乙個空格分開。陣列的長度範圍 每個數字a i 的範圍為 輸出形式 輸出乙個整數,表示逆序對的個數。...