该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 3,4,5,1,2 };
int n = InverseCount(a);
System.out.print(n);
}
public static void PrintArray(int[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
System.out.print(a[i]);
if (i < n - 1)
System.out.print(' ');
}
System.out.println();
}
public static int[] Intersection(int[] a, int[] b, int dira, int dirb) {
int n = a.length, m = b.length;
int[] c = new int[n];
int i = dira == 1 ? 0 : n - 1, j = dirb == 1 ? 0 : m - 1;
int k = 0;
while (i >= 0 && i < n && j >= 0 && j < m) { //这个循环的意义?
if (a[i] == b[j])
{
c[k++] = a[i];
i += dira;
j += dirb;
}
else if (a[i] < b[j])
i += dira;
else
j += dirb;
}
int[] d = new int[k];
for (j = 0; j < k; ++j)
d[j] = c[j];
return d;
}
public static int InverseCount(int[] a) {
int[] tmp = new int[a.length];
return InverseCount(a, tmp, 0, a.length - 1);
}
public static int InverseCount(int[] a, int[] tmp, int left, int right) {
if (left < right) { //这个循环的意义?
int m = (left + right) / 2;
int n1 = InverseCount(a, tmp, left, m); //Debug过程中发现在第一次return 0后跳到了这一步,且right从0变成1,为什么?
int n2 = InverseCount(a, tmp, m + 1, right);//第二次return 0后调到了这一步,且right依然为1,为什么?
int n3 = Merge(a, tmp, left, m + 1, right);
return n1 + n2 + n3;
}
return 0;
}
public static int Merge(int[] a, int[] tmp, int ls, int rs, int re) {
int ic = 0, k = ls;
int le = rs - 1, n = re - ls + 1;
while (ls <= le && rs <= re) { //这个循环的意义?
if (a[ls] < a[rs]) {
tmp[k++] = a[ls++];
} else if (a[ls] > a[rs]) {
tmp[k++] = a[rs++];
ic += le - ls + 1;
} else {
tmp[k++] = a[ls++];
rs++;
}
}
while (ls <= le)
tmp[k++] = a[ls++];
while (rs <= re)
tmp[k++] = a[rs++];
for (int i = 0; i < n; ++i, re--)
a[re] = tmp[re];
return ic;
}