陣列中的逆序對(c )

2021-10-01 01:24:32 字數 1629 閱讀 5341

參考部落格:

題目描述:

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。 即輸出p%1000000007

輸入描述:

題目保證輸入的陣列中沒有的相同的數字

資料範圍:

對於%50的資料,size<=10^4

對於%75的資料,size<=10^5

對於%100的資料,size<=2*10^5

思路:

基於歸併排序的思想統計逆序對:先把陣列分割成子陣列,再子陣列合併的過程中統計逆序對的數目。統計逆序對時,先統計子陣列內部的逆序對的數目,再統計相鄰子陣列的逆序對數目。

利用歸併排序:比如 9 5 7 4把長度為4的陣列分解成長度為2的分組,把長度為2的陣列分解成長度為1的陣列->95 74 ->9 5 7 4

合併排序->59 74 ->4579主要的演算法在merge裡面 因為合併排序後的資料比如:6789 2345。。。6大於2則6789均大於2,cnt+=4;6大於3則6789均大於3,cnt+=4;6大於3則6789均大於3,cnt+=4;6大於4則6789均大於4,cnt+=4;

詳見**:

#include

#include

using

namespace std;

int cnt =0;

void

merge

(vector<

int>

& data,

int start,

int mid,

int end)

else

tmp.

push_back

(data[i++])

;//6789 10 11 12 13 6小於10 那麼tmp.push_back(6)

}//tmp就是存data(start,end)區間內從小到大的儲存起來

while

(i <= mid)

while

(j <=end)

for(

int i =

0; i < tmp.

size()

;++i)

}void

mergesort

(vector<

int>

& data,

int start,

int end)

//分解

}int

inversepairs

(vector<

int> data)

return cnt;

}void

main()

;//答案為:2519

//vectordata = ;

//答案為:7

//vectordata = ;

//答案為:7

cout <<

inversepairs

(data)

<< endl;

cin.

get();

return

;}

9 陣列中的逆序對 C

class solution void onesort vector int data,vector int temp,int left,int mid,int right while i mid temp start data i while j right temp start data j w...

陣列中逆序對

題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...

陣列中的逆序對

來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...