Đây là những MERGE gốc và MERGE-Sắp xếp các thuật toán từ Cormen, Leiserson, Rivest, Stein Giới thiệu về thuật toán:
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
và
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)
tại dòng 8 và 9 trong MERGE vô cực là thẻ được gọi là sentinel, có giá trị như vậy mà tất cả các phần tử mảng nhỏ hơn sau đó nó. Để có được số đảo ngược, bạn có thể giới thiệu số lượt truy cập toàn cục, giả sử ninv được khởi tạo bằng 0 trước khi gọi MERGE-SORT và hơn để sửa đổi thuật toán MERGE bằng cách thêm một dòng vào câu lệnh khác sau dòng 16, chẳng hạn như
ninv += n1 - i
hơn sau khi MERGE-Sắp xếp xong ninv sẽ giữ số đảo
Rất tương tự: http://stackoverflow.com/questions/4552591/how-to-find-the-number-of- inversions-in-an-array. Sự khác biệt là điều này chỉ định mảng chứa một hoán vị, trái ngược với các giá trị tùy ý. –
Cũng liên quan: [Đếm đảo ngược trong một mảng] (http://stackoverflow.com/questions/337664/counting-inversions-in-an-array) – PengOne