public class Test {
public static int reverseCount = 0;
public static void merge(int array[], int begin, int mid, int end) {
int i, j, k, n1, n2;
n1 = mid - begin + 1;
n2 = end - mid;
int[] L = new int[n1];
int[] R = new int[n2];
for (i = 0, k = begin; i < n1; i++, k++) {
L[i] = array[k];
}
for (i = 0, k = mid + 1; i < n2; i++, k++) {
R[i] = array[k];
}
for (k = begin, i = 0, j = 0; i < n1 && j < n2; k++) {
if (L[i] < R[j]) {
array[k] = L[i++];
} else {
reverseCount += mid - i + 1;
array[k] = R[j++];
}
}
if (i < n1) {
for (j = i; j < n1; j++, k++) {
array[k] = L[j];
}
}
if (j < n2) {
for (i = j; i < n2; i++, k++) {
array[k] = R[i];
}
}
}
public static void merge_sort(int a[], int begin, int end) {
if (begin < end) {
int mid = (begin + end) / 2;
merge_sort(a, begin, mid);
merge_sort(a, mid + 1, end);
merge(a, begin, mid, end);
}
}
public static void main(String[] args) {
int array[] = {1, 5, 3, 2, 6};
merge_sort(array, 0, array.length - 1);
System.out.println(reverseCount);
}
}
array[begin, mid] <----------> L[0, mid - begin + 1]
array[mid + 1, end] <----------> R[0, end - mid]
例如,进行到某一状态:L[i] > R[j](5, 3),那么后面的(8, 3)、(9, 3)也都是逆序对
1 2 5 8 9 3 6
i mid j