这些是原始的 MERGE 和 MERGE-SORT 算法
来自 Cormen、Leiserson、Rivest、Stein 算法简介:
MERGE(A,p,q,r)
1 n1 = q - p + 1
2 n2 = r - q
3 let L[1..n1 + 1] and R[1..n2 + 1] be new arrays
4 for i = 1 to n1
5 L[i] = A[p + i - 1]
6 for j = 1 to n2
7 R[j] = A[q + j]
8 L[n1 + 1] = infinity
9 R[n2 + 1] = infinity
10 i = 1
11 j = 1
12 for k = p to r
13 if L[i] <= R[j]
14 A[k] = L[i]
15 i = i + 1
16 else A[k] = R[j]
17 j = j + 1
和
MERGE-SORT(A,p,r)
1 if p < r
2 q = floor((p + r)/2)
3 MERGE-SORT(A,p,q)
4 MERGE-SORT(A,q + 1,r)
5 MERGE(A,p,q,r)
在 MERGE infinity 的第 8 行和第 9 行是所谓的哨兵卡,
它的值使得所有数组元素都小于它。
要获得反转的数量,可以引入一个全局计数器,
假设 ninv 在调用 MERGE-SORT 之前初始化为零
而不是通过添加一行来修改 MERGE 算法
在第 16 行之后的 else 语句中,类似于
ninv += n1 - i
比在 MERGE-SORT 完成后 ninv 会保存倒数的次数