notafraiddd 2020-03-09 04:17 采纳率: 0%
浏览 225

关于归并排序问题(具体代码分析)

各位前辈好!在自学的过程中阅读代码时候出现困难,如下:

public class MergeSort {

public static void mergeSort(int[] arrays, int left, int right) {
            // 如果数组还可以拆分
    if (left < right) {
        //数组的中间位置
        int middle = (left + right) / 2;
        //拆分左边数组
        mergeSort(arrays, left, middle);
        //拆分右边数组
        mergeSort(arrays, middle + 1, right);
        //合并
        merge(arrays, left, middle, right);
    }
}


/**
 * 合并数组
 */
public static void merge(int[] arr, int left, int middle, int right) {
    //申请合并空间 大小为两个已经排序序列之和
    int[] temp = new int[right - left + 1];
    //i 和 j为两个已经排好序的数组的起始位置
    int i = left;
    int j = middle + 1;
    int k = 0;
    //排序
    while (i <= middle && j <= right) {
        //将比较小的数组放入合并空间
        if (arr[i] < arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    //将左边剩余元素写入合并空间
    while (i <= middle) {
        temp[k++] = arr[i++];
    }
    //将右边剩余的元素写入合并空间
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    //将排序后的数组写回原来的数组
    for (int l = 0; l < temp.length; l++) {
        arr[l + left] = temp[l];
    }

}

public static void main(String[] args) {
    int[] ints = {5, 3, 4, 1, 2};
    mergeSort(ints,0,ints.length-1);
    System.out.println(Arrays.toString(ints));
}

}

这个代码我反复阅读了很久,但是最后得出的结果是1 2 5 3 4
我不是很明白这个代码中到底是怎么排序的

我阅读网上其他归并排序的讲解,里面的图解中,分段最后都分到了一个数字为一段,如图
图片说明

在这段代码中为什么没有这样分呢,还是我分了我没有看懂呢?

在方法mergeSort中,if语句只将数组分成了[5,3,4]和[1,2],然后再merge方法中直接就是已经排序的序列了,我看不出来在哪里进行的排序,并且我用eclipse运行后结果是1 2 3 4 5

请各位大神前辈多多指点!
谢谢!!!

  • 写回答

2条回答 默认 最新

  • miaoch 2020-03-09 10:13
    关注
                    mergeSort(arrays, left, middle);
        //拆分右边数组
        mergeSort(arrays, middle + 1, right);
        //合并
        merge(arrays, left, middle, right);
    
                第一句mergSort 534 会进入递归, mergeSort 12 和 merge是在递归出来后才执行的。
                所以顺序应该是这样的
                534,12
                53, 4     12  
                5,3 4      12
                35, 4       12
                345,12 这里到了第一层递归位置
                345         1,2
                345,12
                12345   这里是第一层的merge
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。