演算法 歸併排序 小和問題 逆序對問題

2022-07-16 18:51:13 字數 885 閱讀 4894

在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和稱為小和問題。

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...