image.png
image.png

代码实现

  1. package com.test.clickhouse.config;
  2. import java.util.Arrays;
  3. class Merge {
  4. // 用于辅助合并有序数组
  5. private static int[] temp;
  6. public static void sort(int[] nums) {
  7. // 先给辅助数组开辟内存空间
  8. temp = new int[nums.length];
  9. // 排序整个数组(原地修改)
  10. sort(nums, 0, nums.length - 1);
  11. }
  12. // 定义:将子数组 nums[lo..hi] 进行排序
  13. private static void sort(int[] nums, int lo, int hi) {
  14. System.out.println("sort... nums is " + Arrays.toString(nums) + ",lo =" + lo + ",hi=" + hi);
  15. if (lo == hi) {
  16. // 单个元素不用排序
  17. return;
  18. }
  19. // 这样写是为了防止溢出,效果等同于 (hi + lo) / 2
  20. int mid = lo + (hi - lo) / 2;
  21. // 先对左半部分数组 nums[lo..mid] 排序
  22. sort(nums, lo, mid);
  23. // 再对右半部分数组 nums[mid+1..hi] 排序
  24. sort(nums, mid + 1, hi);
  25. // 将两部分有序数组合并成一个有序数组
  26. merge(nums, lo, mid, hi);
  27. }
  28. // 将 nums[lo..mid] 和 nums[mid+1..hi] 这两个有序数组合并成一个有序数组
  29. private static void merge(int[] nums, int lo, int mid, int hi) {
  30. System.out.println(
  31. "nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp) + ",lo is " + lo + ",mid=" +
  32. mid + ",hi=" + hi);
  33. int[] temp1 = new int[nums.length];
  34. int i = lo;
  35. int j = mid + 1;
  36. int index = lo;
  37. while (i <= mid && j <= hi) {
  38. System.out.println(
  39. "whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +
  40. ",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);
  41. if (nums[i] > nums[j]) {
  42. temp1[index] = nums[j];
  43. j++;
  44. } else {
  45. temp1[index] = nums[i];
  46. i++;
  47. }
  48. index++;
  49. System.out.println(
  50. "whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +
  51. ",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);
  52. System.out.println("************************************************");
  53. }
  54. while (i <= mid) {
  55. temp1[index] = nums[i];
  56. i++;
  57. index++;
  58. }
  59. while (j <= hi) {
  60. temp1[index] = nums[j];
  61. j++;
  62. index++;
  63. }
  64. System.out.println(
  65. "whie ...nums is " + Arrays.toString(nums) + ",temp is " + Arrays.toString(temp1) + ",lo is " + lo +
  66. ",mid=" + mid + ",hi=" + hi + ",i=" + i + ",j=" + j);
  67. System.out.println("====================");
  68. for (int k = lo; k <= hi; k++) {
  69. nums[k] = temp1[k];
  70. }
  71. }
  72. public static void main(String[] args) {
  73. // int[] ints = {5, 2, 3, 1};
  74. int[] ints = {8, 4, 9, 10, 11, 12, 5, 7, 1, 3, 6, 2};
  75. // int[] ints = {8,4,5,7,1,3,6,2};
  76. // int[] ints = {5, 1, 1, 2,0,0};
  77. sort(ints);
  78. System.out.println(Arrays.toString(ints));
  79. }
  80. }

参考

https://blog.csdn.net/weixin_45857153/article/details/110474615