代码实现
package com.test.clickhouse.config;import java.util.Arrays;class Merge {// 用于辅助合并有序数组private static int[] temp;public static void sort(int[] nums) {// 先给辅助数组开辟内存空间temp = new int[nums.length];// 排序整个数组(原地修改)sort(nums, 0, nums.length - 1);}// 定义:将子数组 nums[lo..hi] 进行排序private static void sort(int[] nums, int lo, int hi) {System.out.println("sort... nums is " + Arrays.toString(nums) + ",lo =" + lo + ",hi=" + hi);if (lo == hi) {// 单个元素不用排序return;}// 这样写是为了防止溢出,效果等同于 (hi + lo) / 2int mid = lo + (hi - lo) / 2;// 先对左半部分数组 nums[lo..mid] 排序sort(nums, lo, mid);// 再对右半部分数组 nums[mid+1..hi] 排序sort(nums, mid + 1, hi);// 将两部分有序数组合并成一个有序数组merge(nums, lo, mid, hi);}// 将 nums[lo..mid] 和 nums[mid+1..hi] 这两个有序数组合并成一个有序数组private static void merge(int[] nums, int lo, int mid, int hi) {System.out.println("nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp) + ",lo is " + lo + ",mid=" +mid + ",hi=" + hi);int[] temp1 = new int[nums.length];int i = lo;int j = mid + 1;int index = lo;while (i <= mid && j <= hi) {System.out.println("whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);if (nums[i] > nums[j]) {temp1[index] = nums[j];j++;} else {temp1[index] = nums[i];i++;}index++;System.out.println("whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);System.out.println("************************************************");}while (i <= mid) {temp1[index] = nums[i];i++;index++;}while (j <= hi) {temp1[index] = nums[j];j++;index++;}System.out.println("whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);System.out.println("====================");for (int k = lo; k <= hi; k++) {nums[k] = temp1[k];}}public static void main(String[] args) {// int[] ints = {5, 2, 3, 1};int[] ints = {8, 4, 9, 10, 11, 12, 5, 7, 1, 3, 6, 2};// int[] ints = {8,4,5,7,1,3,6,2};// int[] ints = {5, 1, 1, 2,0,0};sort(ints);System.out.println(Arrays.toString(ints));}}
参考
https://blog.csdn.net/weixin_45857153/article/details/110474615

