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 case
return;
}
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];
}
}