题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
思路:归并排序思想。以[7, 5, 6, 4]为例进行讲解。
先把数组分解成两个长度为2的子数组,这两个子数组分别拆分成两个长度为1的子数组。需要统计的两个位置:排序len=2的子数组的时候,合并两个数组。
合并两个数组时,逆序的统计方法:
int count = 0;
public int[] InversePairs(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 分治
InversePairs(nums, low, mid);
InversePairs(nums, mid+1, high);
MargeInversePairs(nums, low, mid, high);
}
return nums;
}
// 归并排序思想的具体实现
public int[] MargeInversePairs (int[] nums, int low, int mid, int high) {
int[] tmp = new int[high-low+1];
int i = mid, j = high, k = high-low;
while (i >= low && j >= mid+1) {
if (nums[i] <= nums[j]) {
tmp[k--] = nums[j--];
} else {
count += (j-mid);
tmp[k--] = nums[i--];
}
}
while (i >= low) {
tmp[k--] = nums[i--];
}
while (j >= mid+1) {
tmp[k--] = nums[j--];
}
for (int p=0; p<tmp.length; p++) {
nums[p+low] = tmp[p];
}
return nums;
}