题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
/**
* 数组中逆序队
*
* @author 过路的守望
*
*/
public class InversePairs {
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 7, 6, 5 };
System.out.println(new InversePairs().inversePairs(array));
}
public int inversePairs(int[] array) {
int len = array.length;
if (len <= 0 || array == null) {
}
return getInversePairs(array, 0, len - 1);
}
/**
* 归并排序O(NlogN)
*
* @param array
* @param left
* @param right
* @return
*/
public int getInversePairs(int[] array, int left, int right) {
int len = right - left;
int count = 0;
if (len > 0) {
int center = (left + right) / 2;
/*
* 左半部分子数组逆序队
*/
int l = getInversePairs(array, left, center);
/*
* 右半部分子数组逆序队
*/
int r = getInversePairs(array, center + 1, right);
/*
* 左右子数组之间逆序队
*/
count = l + r + mergeInversePairs(array, left, center, right);
}
return count;
}
public int mergeInversePairs(int[] array, int left, int center, int right) {
int[] temp = new int[right - left + 1];
int tempPos = temp.length - 1;
int leftPos = center;
int rightPos = right;
int count = 0;
/*
* 左右子数组有一方一比较完
*/
while (leftPos >= left && rightPos >= center + 1) {
if (array[leftPos] > array[rightPos]) {
count += rightPos - center;
temp[tempPos--] = array[leftPos--];
} else {
temp[tempPos--] = array[rightPos--];
}
}
while (rightPos >= center + 1) {
temp[tempPos--] = array[rightPos--];
}
while (leftPos >= left) {
temp[tempPos--] = array[leftPos--];
}
tempPos = 0;
for (int i = left; i <= right; i++) {
array[i] = temp[tempPos++];
}
return count;
}
}