陣列中的逆序對

2021-09-29 13:50:58 字數 1820 閱讀 3360

題目描述:有一組數,對於其中任意兩個陣列,若前面乙個大於後面乙個數字,則這兩個數字組成乙個逆序對,計算給定陣列中的逆序對個數。

給定乙個int陣列a和它的大小n,請返回a中的逆序對個數。

測試樣例:

[1,2,3,4,5,6,7,0],8

返回:7

解題思路:

**思路1:**順序掃瞄整個陣列,沒掃瞄到乙個數,就比較該數與後面數的大小,如果該數小於大於後面的數,就構成逆序對。若該陣列中有n個數,則此演算法的時間複雜度為o(n^2)。

public

class

demo1

}return count;

}public

static

void

main

(string[

] args)

;int c =

count

(a,a.length)

; system.out.

println

(c);

}}

思路2:利用分治思想,採用歸併排序來解決,歸併排序的時間複雜度為o(n*log(n))。例如這個陣列,有4個數。

(1)先將陣列分成乙個乙個的子陣列,直到陣列內只有乙個數,即分成了四個陣列。

(2)再將合併,一邊排序一邊統計逆序對。合併,一邊排序一邊統計逆序對。得到兩個陣列。

(3)再將兩陣列合併,一邊排序一邊統計逆序對,得到結束。

public

class

main2

return

mergesortrecursion

(a,0

,a.length);}

public

static

intmergesortrecursion

(int

array,

int low,

int high)

int mid =

(high + low)/2

;return

mergesortrecursion

(array,low,mid)

+mergesortrecursion

(array,mid,high)

+mergecount

(array,low,mid,high);}

public

static

intmergecount

(int

array,

int low,

int mid,

int high)

else

}while

(i < mid)

while

(j < high)

//從newarray搬回到array中

for(

int t =

0;t < length;t++

)return sumreverse;

}public

static

void

main

(string[

] args)

;int r =

count

(a,7);

system.out.

println

(r);

}}

陣列中逆序對

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

陣列中的逆序對

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

陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...