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

MergeSort实现遇ArrayIndexOutOfBoundsException问题求助

问题根源:Merge方法里的指针变量完全搞混了

你遇到的ArrayIndexOutOfBoundsException完全是因为merge方法中对三个遍历指针(i、j、k)的对应关系和循环条件搞反了,我来给你拆解具体问题:

错误点逐一拆解:

  1. 第一个核心循环的条件完全错误
    你写的循环条件是:

    while (j < left_length && k < right_length) {
    

    这里的指针对应逻辑完全乱了:i才是遍历左数组left的指针,j是遍历右数组right的指针,正确的循环条件应该是i < left_length && j < right_length。

  2. 收尾循环的条件与赋值逻辑错配

    • 第一个收尾循环是要把左数组left剩余的元素补到原数组里,你写的条件是while (j < left_length),这完全不对,应该是while (i < left_length)(因为i是左数组的指针)。
    • 第二个收尾循环是要把右数组right剩余的元素补到原数组里,你写的条件是while (i < right_length),正确条件应该是while (j < right_length),而且内部赋值的指针也对应错了。

修正后的完整Merge方法

public static void merge(int[] arr, int[] left, int[] right, int left_length, int right_length) {
    int i = 0; // 左数组left的遍历指针
    int j = 0; // 右数组right的遍历指针
    int k = 0; // 原数组arr的填充指针

    // 同时遍历左右数组,取较小值放入原数组
    while (i < left_length && j < right_length) {
        if (left[i] < right[j]) {
            arr[k] = left[i];
            i++;
        } else {
            arr[k] = right[j];
            j++;
        }
        k++; // 不管取哪边的元素,原数组指针统一后移
    }

    // 补全左数组剩余元素
    while (i < left_length) {
        arr[k] = left[i];
        i++;
        k++;
    }

    // 补全右数组剩余元素
    while (j < right_length) {
        arr[k] = right[j];
        j++;
        k++;
    }
}

小测试建议

修复后可以先拿长度为1、2、3的极小数组测试,比如{3,1}或者{5,2,7},这种小数据量更容易快速验证指针逻辑是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:32:52