You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

归并排序递归调用赋值逻辑疑问:left数组内容更新机制求解

归并排序中left数组的更新逻辑解析

你的困惑核心在于没搞清楚Java中数组的引用传递特性,以及递归调用sort(left)的实际作用。下面结合你的例子一步步拆解:

关键原理:数组是引用类型

在Java里,数组属于引用类型。当你调用sort(left)时,传递的不是left数组的副本,而是指向这个数组对象的引用——也就是说,sort方法内部操作的就是你创建的那个left数组本身,而非新数组。

结合8元素数组实例的递归过程

以初始数组{209, 47, 16, 82, 34, 552, 1995, 1024}为例,跟踪前4个元素的递归流程:

  1. 第一次拆分出left数组为{209, 47, 16, 82},调用sort(left)进入递归。
  2. 在这个sort调用里,拆分left为{209, 47}和{16, 82},先调用sort(left)(此时left是{209, 47})。
  3. 进入更深层的sort调用,拆分出left={209}、right={47}:
    • 两个子数组长度都小于2,sort(left)和sort(right)直接返回。
    • 执行merge(left, right, array)——这里的array就是当前方法的入参,也就是{209, 47}这个数组!merge会把排序后的{47, 209}直接写入这个数组,原数组{209, 47}被修改为{47, 209}。
  4. 回溯到上一层(处理{209, 47, 16, 82}的sort方法),此时它的left数组已经是排序好的{47, 209}——因为刚才的sort(left)直接修改了这个数组本身。
  5. 接着处理right数组{16, 82},同样的递归过程会把它修改为有序的{16, 82},之后merge这两个有序子数组,将结果写入当前方法的入参数组(即最初的{209, 47, 16, 82}),使其变成{16, 47, 82, 209}。

总结

递归调用sort(left)时,方法内部通过拆分、merge操作直接修改了传入的left数组,所以当递归回溯时,left已经是有序状态。不需要额外赋值语句,因为全程操作的是同一个数组对象。

内容的提问来源于stack exchange,提问作者sper1997

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:15:27