解法:可以使用归并排序的方法将数组分解成子数组,将子数组归并排序统计子数组的逆序数,最终统计整个数组的逆序数。
8 3 2 9 7 1 5 4
8 3 2 9 7 1 5 4
8 3 2 9 7 1 5 4
8 3 2 9 7 1 5 4
3 8 2 9 1 7 4 5 (count=1+1+1=3)
2 3 8 9(count+=mid-i+1=2) 1 4 5 7(count+=mid-i+1+mid-i+1=2)
1 2 3 4 5 7 8 9(count+=(3-0+1)+(3-2+1)+(3-2+1)+(3-2+1)=10)
count=17
static int mergeSort(int[] arr, int l, int r) {
if (l >= r) {
return 0;
}
int mid = l + ((r - l) >> 1);
int count = mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r);
int tempArrSize = r - l + 1;
int[] tempArr = new int[tempArrSize];
int i = l;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= r) {
if (arr[i] > arr[j]) {
count += mid - i + 1;
tempArr[k] = arr[j];
++j;
} else {
tempArr[k] = arr[i];
++i;
}
++k;
}
while (i <= mid) {
tempArr[k] = arr[i];
++i;
++k;
}
while (j <= r) {
tempArr[k] = arr[j];
++j;
++k;
}
for (int m = 0; m < tempArr.length; m++) {
arr[m + l] = tempArr[m];
}
return count;
}