在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。例如:
對於陣列[1,3,4,2,5]
1左邊比1小的數,沒有;
3左邊比3小的數,1;
4左邊比4小的數,1、3;
2左邊比2小的數,1;
5左邊比5小的數,1、3、4、2;
所以小和為1+1+3+1+1+3+4+2=16
歸併排序。在歸併演算法的基礎上做略微改動,即merge中新增了變數res記錄每次併入操作應該累加的小和、mergesort則將每次併入應該累加的小和彙總。
遍歷依次求每個數的小和過程中有很多比較是重複的,而利用歸併排序時利用了併入的兩個序列分別有序的特性省去了不必要的比較,如134併入25時,2>1直接推出2後面的數都》1,因此直接1*(endindex-indexof(2)+1)即可。
public
static
intsmallsum
(int
arr)
return
mergesort
(arr,
0, arr.length -1)
;}public
static
intmergesort
(int
arr,
int left,
int right)
int mid = left +
(right - left)/2
;return
mergesort
(arr, left, mid)
+mergesort
(arr, mid +
1, right)
+merge
(arr, left, mid, right);}
public
static
intmerge
(int
arr,
int left,
int mid,
int right)
while
(p1 <= mid)
while
(p2 <= right)
for(
int j =
0; j < help.length; j++
)return result;
}
歸併排序 小和問題 逆序對
引言 求小和問題 在隨機元素,隨機數組大小的陣列中,找出左邊比右邊元素小的所有元素之和。例如 陣列 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大,...
python 堆排序 小和問題 逆序對
def main arr 主函式 ifnot arr or len arr 2 return arr return partition arr,0,len arr 1 分defpartition arr,l,r base case if l r return mid l r l 2 left arr...
歸併1 逆序對 小和問題(歸併)
逆序對就是乙個陣列中前面的值和大於後面的值的一組數。那麼把陣列分成前後兩部分,分別進行歸併,歸併到最後merge兩個陣列,在這個過程中排序,並且計算出有多少個數是逆序的。這樣到後來歸併兩個陣列的時候,已經知道兩個陣列各自有多少逆序對了,只需要計算歸併過程中產生的逆序對。因為已經是排序完的,所以找到第...