順序掃瞄整個陣列,每掃瞄到乙個數字的時候,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這兩個數字就組成乙個逆序對。假設陣列中含有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...