Question:
设A[1..n]是一个包含N个非负整数的数组。如果在i〈 j的情况下,有A〉A[j],则(i,j)就称为A中的一个逆序对。
Answer:
在归并的时候,当右边的A[j]被复制到B中时,左边还没来得及复制的就是所有左边比A[j]大的数。
#include <iostream>
using namespace std;
int A[] = { 1, -3, 2, -5, 4, 0 };
int B[6];
int r = 0;
void merge(int l, int h) {
if (l >= h - 1) {
return;
}
int m = l + (h - l) / 2;
merge(l, m);
merge(m, h);
int i = l, j = m, k = l;
while (i < m && j < h) {
if (A[i] > A[j]) {
B[k++] = A[j++];
r += m - i;
} else {
B[k++] = A[i++];
}
}
if (i < m) {
for (; i < m; i++) {
B[k++] = A[i++];
}
}
if (j < h) {
for (; j < h; j++) {
B[k++] = A[j++];
}
}
for (int x = l; x < h; x++) {
A[x] = B[x];
}
}
int main() {
int n = sizeof(A) / sizeof(int);
merge(0, n);
for (int i = 0; i < n; i++) {
cout << A[i] << " ";
}
cout << endl;
cout << "reverse pair number is " << r << endl;
}
运行结果:
-5 -3 0 1 2 4
reverse pair number is 7