// for test publicstaticint[] generateRandomArray(int maxSize, int maxValue) { int[] arr = newint[(int) ((maxSize + 1) * Math.random())]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); } return arr; }
// for test publicstaticint[] copyArray(int[] arr) { if (arr == null) { returnnull; } int[] res = newint[arr.length]; for (int i = 0; i < arr.length; i++) { res[i] = arr[i]; } return res; }
// for test publicstaticbooleanisEqual(int[] arr1, int[] arr2){ if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) { returnfalse; } if (arr1 == null && arr2 == null) { returntrue; } if (arr1.length != arr2.length) { returnfalse; } for (int i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { returnfalse; } } returntrue; }
// for test publicstaticvoidprintArray(int[] arr){ if (arr == null) { return; } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); }
privatestaticintmergeSort(int[] arr, int l, int r){ if (l == r) { return0; } int m = l + ((r - l) >> 1); return mergeSort(arr, l, m) + mergeSort(arr, m+1, r) + merge(arr, l, m, r); }
privatestaticintmerge(int[] arr, int l, int m, int r){ int[] help = newint[r - l + 1]; int i = 0; int p = l; int q = m + 1; int res = 0;
//merge过程中算小数对和 while (p <= m && q <= r) { res += arr[p] < arr[q] ? arr[p] * (r - q + 1) : 0; help[i++] = arr[p] < arr[q] ? arr[p++] : arr[q++]; } while(p <= m) { help[i++] = arr[p++]; } while(q <= r) { help[i++] = arr[q++]; } for (i = 0; i < help.length; i++) { arr[l + i] = help[i]; } return res; }