1. public static void main(String[] args) {
    2. int[] arr = {1, 3, 5, 7, 8, 3, 4, 6, 0};
    3. System.out.println(Arrays.toString(recursiveSort(arr)));
    4. }
    5. public static int[] recursiveSort(int[] arr) {
    6. if (arr == null || arr.length == 1) {
    7. return arr;
    8. }
    9. // 如何将一个数组分成两个合理的数组
    10. int middleIndex = arr.length / 2;
    11. int[] arrLeft = new int[middleIndex];
    12. int[] arrRight = new int[arr.length - middleIndex];
    13. for (int i = 0; i < arr.length; i++) {
    14. if (i < middleIndex) {
    15. arrLeft[i] = arr[i];
    16. continue;
    17. }
    18. arrRight[i - middleIndex] = arr[i];
    19. }
    20. return mergeArr(
    21. recursiveSort(arrLeft),
    22. recursiveSort(arrRight)
    23. );
    24. }
    25. /**
    26. * 将数组中的元素有序的排列起来
    27. *
    28. * @param leftArr 左边的数组
    29. * @param rightArr 右边的数组
    30. * @return 一个包含左右两个数组的有序数组
    31. */
    32. public static int[] mergeArr(int[] leftArr, int[] rightArr) {
    33. LinkedList<Integer> result = new LinkedList<Integer>();
    34. // 将左右两个数组 有序的放入这个result数组里面
    35. LinkedList<Integer> leftList = new LinkedList<>();
    36. for (int i = 0; leftArr != null && i < leftArr.length; i++) {
    37. leftList.add(leftArr[i]);
    38. }
    39. // Collections.addAll(leftList,leftArr);
    40. LinkedList<Integer> rightList = new LinkedList<>();
    41. for (int i = 0; rightArr != null && i < rightArr.length; i++) {
    42. rightList.add(rightArr[i]);
    43. }
    44. // Collections.addAll(rightList,rightArr);
    45. /**
    46. * 每一次回来的数组都是排好顺序的
    47. * 排序的逻辑
    48. * 如果两个数组转换为列表的长度都大于零
    49. * 此时比较两个数组的第一个元素 将较小的放在放在集合里
    50. * 循环 一次排放
    51. * 每一次循环结束条件 必有列表的元素为空
    52. * 无论那一个 列表为空 直接放到列表后面就好 原因如下:
    53. * - 假设 leftList为空 ,根据判断条件和弹出条件 可以知道 leftList的所有所有元素 * 一定小于 rightList的剩余元素
    54. * rightList 和 leftList 都是一个递增的列表
    55. * - 所有的数组在上面的递归拆分条件下 最终都以leftList 和 rightList
    56. * 为单个元素的情况 进行merge 之后 返回的数组一定是递增顺序的 。
    57. */
    58. while (leftList.size() >0 && rightList.size() > 0) {
    59. result.add(
    60. leftList.getFirst() < rightList.getFirst() ? leftList.removeFirst() : rightList.removeFirst()
    61. );
    62. }
    63. result.addAll(leftList);
    64. result.addAll(rightList);
    65. int[] array = result.stream().flatMapToInt(IntStream::of).toArray();
    66. System.out.println(Arrays.toString(array));
    67. return array;
    68. }
    69. // 输出结果
    70. [1, 3]
    71. [5, 7]
    72. [1, 3, 5, 7]
    73. [3, 8]
    74. [0, 6]
    75. [0, 4, 6]
    76. [0, 3, 4, 6, 8]
    77. [0, 1, 3, 3, 4, 5, 6, 7, 8]
    78. [0, 1, 3, 3, 4, 5, 6, 7, 8]