在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和稱為小和問題。
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 左側比 3 小的數,2,1。
output: 2+2+4+2+4+5+1+2+1=23
此處使用歸併排序,在 merge 時,由於左右兩部分都已經有序,可以確定一側的數都大於正在比較的數,例如:
歸併 2 4 5 | 1 3 7 兩個部分時,2 比 3 小,此時可以確定後面的數都大於 2,此時便可以一次性計算小和 2 * 2(兩個數大於 2),而不用乙個個遍歷。
總結
使用歸併排序演算法的快速之處在於,歸併的兩個部分對內都是有序的,如2 4 5 | 1 3 7
兩個部分。因此在比較大小的時候,可以迅速確定整批的資料大小,而不用重複遍歷計算。
又由於每一次 merge 的資料都是新的,此前沒有重複算過,因此不會多次計算或漏算。
在乙個陣列中,左邊的數如果比右邊的數大,則這兩個數構成乙個逆序對。
這個問題也適合使用歸併排序的方法進行批量計算,例如
仍然以 2 4 5 | 1 3 7 資料舉例,因為
2 4 5 | 1 3 7
↑ ↑
此時 (2,1) 組成逆序對,因此 (4,1) (5,1) 逆序對也可以直接推導出來
使用這種計算有效的利用了歸併排序 merge 過程中,兩部分資料有序的特徵,使得大大加快比較的速度。 歸併排序 小和問題 逆序對
引言 求小和問題 在隨機元素,隨機數組大小的陣列中,找出左邊比右邊元素小的所有元素之和。例如 陣列 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大,...
歸併排序以及逆序對問題
void merge sort int q,int l,int r k 0,i l,j mid 1 while i mid j r while i mid tmp k q i while j r tmp k q j for int i l,j 0 i r i j q i tmp j 歸併排序與快速排...
《演算法導論》學習 歸併排序(哨兵) 逆序對問題
void merge int a 8 int left,int mid,int right la nla max num 哨兵 for int i 0 i nra i ra nra max num 哨兵 int i 0 int j 0 for int k left k right k else vo...