public class ReserveCount {
int count = 0;
public int calculateCount(int[] a, int n) {
merge(a,n);
return count;
}
private void merge(int a[], int n) {
mergeSort(a,0,n-1);
}
private void mergeSort(int a[], int low, int high) {
int mid = low + (high - low) / 2;
mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
}
private void merge(int[] a, int low, int mid, int high) {
// 临时变量
int[] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int index = 0;
while (i <= mid || j <= high) {
if (a[i] < a[j]) {
temp[index++] = a[i];
i++;
} else {
temp[index++] = a[j];
count += (mid - i + 1);
j++;
}
}
while (i <= mid) {
temp[index++] = a[i];
i++;
}
while (j <= high) {
temp[index++] = a[j];
j++;
}
// 拷贝
for (int k = 0; k < temp.length; i++) {
a[low+k] = temp[k];
}
}
}