1. package com.atguigu.sort;
    2. import java.util.Arrays;
    3. import java.util.Date;
    4. /**
    5. * @author Dxkstart
    6. * @create 2021-10-12-20:06
    7. */
    8. public class MergeSort {
    9. public static void main(String[] args) {
    10. int[] arr = {8,4,5,7,1,3,6,2};
    11. int[] temp = new int[arr.length];//归并排序需要一个额外的空间
    12. mergeSort(arr,0, arr.length - 1,temp);
    13. System.out.println(Arrays.toString(arr));
    14. }
    15. //分+合方法
    16. public static void mergeSort(int[] arr, int left, int right, int[] temp) {
    17. if (left < right) {
    18. int mid = (left + right) / 2;//中间索引
    19. //向左递归分解
    20. mergeSort(arr, left, mid, temp);
    21. //向右递归分解
    22. mergeSort(arr, mid + 1, right, temp);
    23. //合并
    24. merge(arr, left, mid, right, temp);
    25. }
    26. }
    27. //合并的方法
    28. /**
    29. * @param arr 排序的原始数组
    30. * @param left 左边有序列的初始索引
    31. * @param mid 中间索引
    32. * @param right 右边索引
    33. * @param temp 做中转的数组
    34. */
    35. public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
    36. int i = left;//初始化i,左边有序序列的初始索引
    37. int j = mid + 1;//初始化j,右边有序序列的初始索引
    38. int t = 0;//指向temp数组的当前索引
    39. //(一)
    40. //先把左右两边(有序)的数据暗战规则填充到temp数组
    41. //直到左右两边的有序序列,有一边处理完毕为止
    42. while (i <= mid && j <= right) {
    43. //如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素
    44. //即将左边的当前元素,拷贝到temp数组
    45. //然后 t++,i++
    46. if (arr[i] <= arr[j]) {
    47. temp[t] = arr[i];
    48. t++;
    49. i++;
    50. } else {
    51. temp[t] = arr[j];
    52. t++;
    53. j++;
    54. }
    55. }
    56. //(二)
    57. //把有剩余数据的一边的数据一次全部填充到temp
    58. while (i <= mid) {//说明左边的有序序列还有剩余的元素
    59. temp[t] = arr[i];
    60. t++;
    61. i++;
    62. }
    63. while (j <= right) {//说明右边的有序序列还有剩余的元素
    64. temp[t] = arr[j];
    65. t++;
    66. j++;
    67. }
    68. //(三)
    69. //将temp数组的元素拷贝到arr
    70. //注意,并不是每次都拷贝所有
    71. t = 0;
    72. int tempLeft = left;
    73. //第一次合并 tempLeft = 0,right = 1
    74. //最后一次合并 tempLeft = 0, right = 7
    75. while (tempLeft <= right) {
    76. arr[tempLeft] = temp[t];
    77. t++;
    78. tempLeft++;
    79. }
    80. }
    81. }