引言
求小和問題:在隨機元素,隨機數組大小的陣列中,找出左邊比右邊元素小的所有元素之和。
例如:陣列[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大,那就是18+2+1=21;最後6比4、2、5、1、3都大,結果就是21+4+2+5+1+3=36。那麼最後的結果就是36。
解法:使用歸併排序來進行求和,在歸併的時候把陣列分成左右兩個,在歸併排序進行左右兩個陣列進行合併排序的時候進行計算。如果左邊陣列元素n,小於右邊陣列元素m,那麼從右邊陣列右指標p到右邊陣列最後r就有(r-p+1)個n,依次累計相加,最後求出最小和。
如果要求逆序對,所謂逆序對就是[4,2],[4,1],[5,1]....., 那麼就是左邊比右邊大,那麼有多少個逆序對就是,中間位置mid減去左指標下座標p1+1個逆序對,也就是(mid-p1+1)個逆序對,把逆序對相加進行返回就是共有多少逆序對。
public class mergesortsum
// 排序並返回最小和
return mergesortsumtest(arr,0,arr.length-1);
}public static int mergesortsumtest(int arr, int l, int r)
int mid = l + (r -l) /2;
// 左邊的最小和+右邊的最小和+最後排序好的最小和就是最後的結果
return mergesortsumtest(arr, l, mid) + mergesortsumtest(arr, mid+1, r) + mergesortsumarray(arr,l,mid,r);
} public static int mergesortsumarray(int arr, int l, int mid, int r)
while(p1<=mid)
while(p2<=r)
return sum; }
}
以上就是求最小和問題**,在左右陣列進行合併的時候來進行計算小和。也可以在此基礎上求取逆序對,具體請看注釋。 演算法 歸併排序 小和問題 逆序對問題
在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和稱為小和問題。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 ...
逆序對 (歸併排序)
逆序對的nlogn方法,改進後的歸併排序 給定排列p,求排列的逆序對數量。p的長度 100000。要求o nlogn 定義歸併排序過程merge l,r merge l,r merge l,mid merge mid 1,r count l,mid,mid 1,r 只需要考慮左右兩段之間造成的逆序對...
歸併排序 逆序對
按照劉汝佳說的,歸併排序分三步 1.劃分問題,即把序列分成元素盡量相等的兩半 2.遞迴求解 3.合併子問題 其實就是把乙個序列不斷的二分,直到只有兩個元素的時候,然後排序,然後返回,再排序。先上 include using namespace std long long a 100005 t 100...