public static void MergeSort(int[] arr) {if (arr == null || arr.length < 2) {return;}Process(arr, 0, arr.length - 1);}public static void Process(int[] arr, int L, int R) {if (L == R) { // base casereturn;}int mid = L + ((R - L) >> 1);// L..mid 有序Process(arr, L, mid);// mid+1..R 有序Process(arr, mid + 1, R);// Merge 两侧各指向自己第一个数,左侧小拷贝左侧的,右侧小拷贝右侧的,相等默认拷贝左边的,Merge(arr, L, mid, R);}public static void Merge(int[] arr, int L, int M, int R) {int[] help = new int[R - L + 1]; // 有这么多数int i = 0; // 辅助数组help的下标int p1 = L;// 左侧第一个数下标int p2 = M + 1; // 右侧第一个数下标// 此循环结束要么整合结束,要么就会有一个下标越界。while (p1 <= M && p2 <= R) {help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];}// 谁没有越界,谁就把自己剩下的放入到辅助数组当中。while (p1 <= M) {help[i++] = arr[p1++];}while (p2 <= R) {help[i++] = arr[p2++];}// 拷贝到原数组当中for (i = 0; i < help.length; i++) {arr[L + i] = help[i];}}
