publicvoidSort(int[] arrs, int L, int R) { int step = 1; int N = arrs.length; while (step < N) { int left = 0; while (left < N) { int mid = left + step - 1; if (mid >= N) break; int right = Math.min(left + 2 * step - 1, N - 1); // 修正右边界计算 Merge(arrs, left, mid, right); // 修正方法调用参数 left = right + 1; } step <<= 1; } }
publicvoidMerge(int[] arrs, int L, int mid, int R) { int[] help = newint[R - L + 1]; int i = 0; int p1 = L; int p2 = mid + 1; while (p1 <= mid && p2 <= R) { help[i++] = arrs[p1] <= arrs[p2] ? arrs[p1++] : arrs[p2++]; } // p2越界 while (p1 <= mid) { help[i++] = arrs[p1++]; } // p1越界 while (p2 <= R) { help[i++] = arrs[p2++]; } for (int j = 0; j < help.Length; j++) arrs[L + j] = help[j]; }
publicintProcess(int[] arr, int L, int R) { if (L >= R) { return0; } int mid = L + ((R - L) >> 1); return Process(arr, L, mid) + Process(arr, mid + 1, R) + MergeAndCount(arr, L, mid, R); }
publicintMergeAndCount(int[] arr, int L, int mid, int R) { int inversionCount = 0; int[] help = newint[R - L + 1]; int i = 0; int p1 = L; int p2 = mid + 1;
int M = L + ((R - L) >> 1); return process(sum,L,M,lower,upper) + process(sum,M + 1,R,lower,upper) + Merge(sum,L,M,R,lower,upper); }
privatestaticintMerge(long[] sum, int L, int M, int R, int lower, int upper) { int ans = 0; int WindowL = L; int WindowR = L; for (int i = M + 1; i <= R; i++) //在左组后找到满足右组中 - upper,lower的数 { long min = sum[i] - upper; long max = sum[i] - lower; while (WindowL <= M && sum[WindowL] < min) WindowL++; while (WindowR <= M && sum[WindowR] <= max) WindowR++; ans += Math.Max(0, (WindowR - WindowL)); } long[] help = newlong[R - L + 1]; int p1 = L; int p2 = M + 1; int j = 0; while (p1 <= M && p2 <= R) { help[j++] = sum[p1] < sum[p2] ? sum[p1++] : sum[p2++]; } while (p1 <= M) { help[j++] = sum[p1++]; } while (p2 <= R) { help[j++] = sum[p2++]; } for(int k = 0; k < help.Length; k++) { sum[L + k] = help[k]; } return ans; }