程式設計題 陣列中的逆序對

2021-10-06 21:02:08 字數 1306 閱讀 3023

順序掃瞄整個陣列,每掃瞄到乙個數字的時候,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這兩個數字就組成乙個逆序對。假設陣列中含有n個數字,由於每個數字都要和o(n)個數字作比較,因此這個演算法的時間複雜度是o(n2)。

對陣列進行氣泡排序,交換次數即為逆序對個數。時間複雜度o(n2)。

採用歸併排序的思路來處理,先分後治:先把陣列分隔成子陣列,先統計出子陣列內部的逆序對的數目,然後再統計出兩個相鄰子陣列之間的逆序對的數目。在統計逆序對的過程中,還需要對陣列進行排序,其實這個排序過程就是歸併排序的思路 。

逆序對的總數=左邊陣列中的逆序對的數量+右邊陣列中逆序對的數量+左右結合成新的順序陣列時**現的逆序對的數量;

時間複雜度時o(n*log(n))。

public

class

antiorder

return

mergesortrecursion

(a,0

, n -1)

;}//遞迴實現歸併排序

public

static

intmergesortrecursion

(int

arr,

int l,

int r)

int mid =

(l + r)/2

;//逆序對的總數= 左邊陣列中的逆序對的數量+

// 右邊陣列中逆序對的數量+左右結合成新的順序陣列時**現的逆序對的數量

return

mergesortrecursion

(arr, l, mid)

+mergesortrecursion

(arr, mid +

1, r)

+merge

(arr, l, mid, r)

;//返回陣列中的逆序對

}//合併兩個已排好序的陣列s[left...mid]和s[mid+1...right]

public

static

intmerge

(int

arr,

int left,

int mid,

int right)

else

}while

(i <= mid)

while

(j <= right)

for(

int k =

0; k < temp.length; k++

)return inversenum;

//返回合併過程中累加逆序對

}}

程式設計題 陣列中的逆序對

題目鏈結 題目描述在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 輸入描述 題目保證輸入的陣列中沒有的相同的數字資料範圍 對於 50的資料,siz...

刷題 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007。用類似歸併排序的思路。coding utf 8 class solution definverse...

51題陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 思路 使用了歸併排序的思想 class solution else if m start...