public class InversePairs {
private int[] data;
public InversePairs(int[] data) {
this.data = data;
}
public int inverse() {
if (data == null || data.length == 0) {
return 0;
}
int count = inversePairsCore(data, 0, data.length - 1);
return count;
}
private int inversePairsCore(int[] d, int start, int end) {
//System.out.println("-->inverse(" + start + ", " + end + ")");
if (start >= end)
return 0;
int mid = (end + start) / 2;
int left = inversePairsCore( d, start, mid );
int right = inversePairsCore( d, mid + 1, end );
int count = merge( d, start, mid, end );
return left + right + count;
}
private int merge(int[] d, int start, int mid, int end) {
//System.out.println(print(d));
//System.out.println("-------->merge(" + start + ", " + mid + ", " + end + ")");
int i = mid;
int j = end;
int count = 0;
int[] copy = new int[data.length];
System.arraycopy(data, 0, copy, 0, data.length);
for (int k = end; k >= start; k--) {
if (i < start)
d[k] = copy[j--];
else if (j <= mid)
d[k] = copy[i--];
else if (copy[i] < copy[j]) {
d[k] = copy[j--];
} else {
d[k] = copy[i--];
count += j - mid;
}
}
//System.out.println(print(d) + " count = " + count);
return count;
}
private String print(int[] a) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < a.length; i++) {
sb.append(a[i]).append(" ");
}
return sb.toString();
}
public static void main(String[] args) {
int[] test = { 7, 5, 6, 4, 2 };
InversePairs in = new InversePairs(test);
int count = in.inverse();
System.out.println(count);
}
}
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数
最新推荐文章于 2024-08-24 22:04:56 发布