逆序对概念:
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
题目描述:
输入一个数组,求出这个数组中的逆序对的总数。
样例:
输入
[1,2,3,4,5,6,0]
输出
6
public class AcWing65 {
int cnt;
public static void main(String[] args) {
int[] nums = {3, 4, 1, 0, 2};
int n = nums.length;
AcWing65 ans = new AcWing65();
ans.mergeSort(nums, 0, n - 1);
System.out.println(ans.cnt);
}
public void mergeSort(int[] a, int l, int r) {
if (l >= r) return;
int mid = (l + r) >> 1;
mergeSort(a, l, mid);
mergeSort(a, mid + 1, r);
int[] tmp = new int[r - l + 1];
int i = l, j = mid + 1;
int k = 0;
while (i <= mid && j <= r) {
if (a[i] <= a[j]) {
tmp[k++] = a[i++];
}else {
tmp[k++] = a[j++];
cnt += (mid - i + 1);
}
}
while (i <= mid) tmp[k++] = a[i++];
while (j <= r) tmp[k++] = a[j++];
for (i = l, k = 0; i <= r; i++, k++) a[i] = tmp[k];
}
}