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

递归合并排序两个数组时出现值丢失问题求助

递归合并有序数组时跳过元素的问题分析

你遇到的跳过元素(如6、15)的问题,根源在两处代码逻辑错误:

1. 递归时错误地将b数组索引增加2

在combineArrayV2方法的else分支中,当a[i] >= b[j]时,递归调用里写了j + 1 + 1,这导致每次取完b数组的一个元素后,索引直接跳过下一个元素。比如取完b[0](4)后,j变成2,直接跳过了b[1](6);后续取完b[3](9)后j变成5,跳过了b[4](15),这就是这些值没进入判断的核心原因。

2. 分支判断未用else连接,存在越界风险

原代码中if(i == 10)和if(j == 10)没有用else连接,当i遍历完a数组时,执行完第一个if的递归后,会继续进入else分支,此时i等于数组长度,访问a[i]会触发数组越界异常。同时硬编码的10也限制了代码只能处理长度为10的数组,改为a.length和b.length更通用。

修正后的代码

public int[] combineArrayV2(int[] a, int[] b, int[] c, int i, int j, int x){
    // 两个数组均遍历完成,返回结果
    if (i >= a.length && j >= b.length) {
        return c;
    }
    // a数组遍历完,将b剩余元素依次存入c
    if(i >= a.length){
        c[x] = b[j];
        System.out.println("On position " + j + " is " + b[j]);
        combineArrayV2(a, b, c, i, j + 1, x + 1);
    }
    // b数组遍历完,将a剩余元素依次存入c
    else if(j >= b.length){
        c[x] = a[i];
        System.out.println("On position " + i + " is " + a[i]);
        combineArrayV2(a, b, c, i + 1, j, x + 1);
    }
    // 比较当前元素,选择较小的存入c并递归
    else {
        if (a[i] < b[j]) {
            c[x] = a[i];
            System.out.println("On position " + i + " is " + a[i]);
            combineArrayV2(a, b, c, i + 1, j, x + 1);
        } else {
            c[x] = b[j];
            System.out.println("On position " + j + " is " + b[j]);
            // 修正为j + 1,避免跳过元素
            combineArrayV2(a, b, c, i, j + 1, x + 1);
        }
    }
    return c;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:21