class Main {
public static void main(String[] args) {
int[] arry = {2,4,3,1,5,6};
System.out.println("该数组逆序对个数为:"+countInversions(arry));
for(int i = 0; i < arry.length; i++){
System.out.print(arry[i]+" ");
}
}
public static int countInversions(int[] arr) {
if (arr == null || arr.length <= 1) {
return 0;
}
int[] temp = new int[arr.length];
return mergeSortAndCountInversions(arr, 0, arr.length - 1, temp);
}
private static int mergeSortAndCountInversions(int[] arr, int left, int right, int[] temp) {
int inversionCount = 0;
if (left < right) {
int mid = (left + right) / 2;
inversionCount += mergeSortAndCountInversions(arr, left, mid, temp);
inversionCount += mergeSortAndCountInversions(arr, mid + 1, right, temp);
inversionCount += mergeAndCountInversions(arr, left, mid, right, temp);
}
return inversionCount;
}
private static int mergeAndCountInversions(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int k = 0;
int inversionCount = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
inversionCount += (mid - i + 1);
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
k = 0;
while (left <= right) {
arr[left++] = temp[k++];
}
return inversionCount;
}
}