递归合并排序两个数组时出现值丢失问题求助
递归合并有序数组时跳过元素的问题分析
你遇到的跳过元素(如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
相关产品推荐
相关产品推荐

