歸併1 逆序對 小和問題(歸併)

2021-10-11 16:17:52 字數 1686 閱讀 2789

逆序對就是乙個陣列中前面的值和大於後面的值的一組數。

那麼把陣列分成前後兩部分,分別進行歸併,歸併到最後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 ...