题目:
计算数组中的逆序对。时间复杂度要求O(nlogn)。
思路 : 在merge sort 的同时计算逆序对的数量。merge sort的时间复杂度满足要求。
merge过程可能遇到的情况:
- lo > mid :左半部分的数组已经归并完,由于右半部分的数组是已经排序好的,所以没有逆序对。
- rec > hi :如上同理。
- temp[rec] < temp[lo] :左边的元素大于右边的元素,表示有逆序对。例如left{0,2,3},right{1,5,6}。当temp[rec] = 1,temp[lo] = 2时,可以看出2和1,3和1组成两个逆序对(2,1),(3,1)。
- temp[rec] >= temp[lo] : 这个则表示不是逆序对。
代码
public class CountingInversions {
//逆序对数量
private static int num = 0;
private static void merge(int []temp, int []a, int lo, int mid, int hi) {
//cooy
for (int i = lo; i <= hi; i