1. public static void MergeSort(int[] arr) {
    2. if (arr == null || arr.length < 2) {
    3. return;
    4. }
    5. Process(arr, 0, arr.length - 1);
    6. }
    7. public static void Process(int[] arr, int L, int R) {
    8. if (L == R) { // base case
    9. return;
    10. }
    11. int mid = L + ((R - L) >> 1);
    12. // L..mid 有序
    13. Process(arr, L, mid);
    14. // mid+1..R 有序
    15. Process(arr, mid + 1, R);
    16. // Merge 两侧各指向自己第一个数,左侧小拷贝左侧的,右侧小拷贝右侧的,相等默认拷贝左边的,
    17. Merge(arr, L, mid, R);
    18. }
    19. public static void Merge(int[] arr, int L, int M, int R) {
    20. int[] help = new int[R - L + 1]; // 有这么多数
    21. int i = 0; // 辅助数组help的下标
    22. int p1 = L;// 左侧第一个数下标
    23. int p2 = M + 1; // 右侧第一个数下标
    24. // 此循环结束要么整合结束,要么就会有一个下标越界。
    25. while (p1 <= M && p2 <= R) {
    26. help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
    27. }
    28. // 谁没有越界,谁就把自己剩下的放入到辅助数组当中。
    29. while (p1 <= M) {
    30. help[i++] = arr[p1++];
    31. }
    32. while (p2 <= R) {
    33. help[i++] = arr[p2++];
    34. }
    35. // 拷贝到原数组当中
    36. for (i = 0; i < help.length; i++) {
    37. arr[L + i] = help[i];
    38. }
    39. }