public static void main(String[] args) { int[] arr = {1, 3, 5, 7, 8, 3, 4, 6, 0}; System.out.println(Arrays.toString(recursiveSort(arr))); } public static int[] recursiveSort(int[] arr) { if (arr == null || arr.length == 1) { return arr; } // 如何将一个数组分成两个合理的数组 int middleIndex = arr.length / 2; int[] arrLeft = new int[middleIndex]; int[] arrRight = new int[arr.length - middleIndex]; for (int i = 0; i < arr.length; i++) { if (i < middleIndex) { arrLeft[i] = arr[i]; continue; } arrRight[i - middleIndex] = arr[i]; } return mergeArr( recursiveSort(arrLeft), recursiveSort(arrRight) ); } /** * 将数组中的元素有序的排列起来 * * @param leftArr 左边的数组 * @param rightArr 右边的数组 * @return 一个包含左右两个数组的有序数组 */ public static int[] mergeArr(int[] leftArr, int[] rightArr) { LinkedList<Integer> result = new LinkedList<Integer>(); // 将左右两个数组 有序的放入这个result数组里面 LinkedList<Integer> leftList = new LinkedList<>(); for (int i = 0; leftArr != null && i < leftArr.length; i++) { leftList.add(leftArr[i]); }// Collections.addAll(leftList,leftArr); LinkedList<Integer> rightList = new LinkedList<>(); for (int i = 0; rightArr != null && i < rightArr.length; i++) { rightList.add(rightArr[i]); }// Collections.addAll(rightList,rightArr); /** * 每一次回来的数组都是排好顺序的 * 排序的逻辑 * 如果两个数组转换为列表的长度都大于零 * 此时比较两个数组的第一个元素 将较小的放在放在集合里 * 循环 一次排放 * 每一次循环结束条件 必有列表的元素为空 * 无论那一个 列表为空 直接放到列表后面就好 原因如下: * - 假设 leftList为空 ,根据判断条件和弹出条件 可以知道 leftList的所有所有元素 * 一定小于 rightList的剩余元素 * rightList 和 leftList 都是一个递增的列表 * - 所有的数组在上面的递归拆分条件下 最终都以leftList 和 rightList * 为单个元素的情况 进行merge 之后 返回的数组一定是递增顺序的 。 */ while (leftList.size() >0 && rightList.size() > 0) { result.add( leftList.getFirst() < rightList.getFirst() ? leftList.removeFirst() : rightList.removeFirst() ); } result.addAll(leftList); result.addAll(rightList); int[] array = result.stream().flatMapToInt(IntStream::of).toArray(); System.out.println(Arrays.toString(array)); return array; }// 输出结果[1, 3][5, 7][1, 3, 5, 7][3, 8][0, 6][0, 4, 6][0, 3, 4, 6, 8][0, 1, 3, 3, 4, 5, 6, 7, 8][0, 1, 3, 3, 4, 5, 6, 7, 8]