逆序對就是乙個陣列中前面的值和大於後面的值的一組數。
那麼把陣列分成前後兩部分,分別進行歸併,歸併到最後merge兩個陣列,在這個過程中排序,並且計算出有多少個數是逆序的。
這樣到後來歸併兩個陣列的時候,已經知道兩個陣列各自有多少逆序對了,只需要計算歸併過程中產生的逆序對。因為已經是排序完的,所以找到第乙個大於第二段中的值的時候,第二個值一定小於全部的第一段中的值,所以count要加上第一段中的剩下的所有資料。
注意兩點1.進行移位操作的時候一定記得加上括號,因為優先順序較低。
2.進行計算的時候因為資料量比較大,所以都要取餘
public class solution
int res=
mergesort
(array,
0,array.length-1)
;return res%
1000000007;}
public int mergesort
(int[
] arr,int lo,int hi)
int mid=lo+
((hi-lo)
>>1)
; int res1=
mergesort
(arr,lo,mid)
%1000000007
; int res2=
mergesort
(arr,mid+
1,hi)
%1000000007
; int res3=
merge
(arr,lo,mid,hi)
%1000000007
;return
(res1+res2+res3)
%1000000007;}
public int merge
(int[
] arr,int lo,int mid,int hi)
if(arr[cur1]
<=arr[cur2]
)else
}while
(cur1<=mid)
while
(cur2<=hi)
for(int i=
0;ireturn count;
}}
小和就是左邊所有小於自己的和,返回乙個所有數的小和之和,每次sort或者merge都產生乙個小和,最終返回3個小和之和。在merge的過程中,找左邊所有小於自己的數,其實就是找右邊所有大於自己的數,也就是merge時右邊的值直接排序並跳過,左邊的值小的話就是右邊此時的剩下的值都大於左邊這個數,左邊這個數乘右邊數的數量就是左邊這個數產生的小和。
public static int smallsum
(int[
] a)
static int mergesort
(int[
] a,int l,int r)
static int merge
(int[
] a,int l,int mid ,int r)
while
(p1<=mid)
while
(p2<=r)
for(int j=
0;jreturn rst;
}
歸併排序 小和問題 逆序對
引言 求小和問題 在隨機元素,隨機數組大小的陣列中,找出左邊比右邊元素小的所有元素之和。例如 陣列 4,2,5,1,7,3,6 第乙個元素4比2大,不算小和,5比4和2都大,那就是4 2 6 1比4和2和5都小,不算小和 7比前面的都大,那就是上次小和6 4 2 5 1 18 然後3前面比2和1大,...
演算法 歸併排序 小和問題 逆序對問題
在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和稱為小和問題。input 2,4,5,1,7,3 2 左側比 2 小的數,沒有 4 左側比 4 小的數,2 5 左側比 5 小的數,2,4 1 左側比 1 小的數,沒有 7 左側比 7 小的數,2,4,5,1 3 ...
歸併求逆序對
求這個逆序對只需要在歸併排序的 中加一句即可。感覺自己有點說不清楚,隨手附上別人的詳細解釋,請戳 詳細介紹 include include includeusing namespace std int a 1000000 int b 1000000 int sum 0 void merge int ...