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

二分查找(bSearch)函数异常导致插入排序输出错误,求修复

问题描述

需要借助递归实现的二分查找函数bSearch完成数组从小到大的插入排序,但当前bSearch函数存在错误,导致输出结果不符合预期。除bSearch外,其余代码不可修改。

输入数据:100 89 65 46 32 90 50 38 67 71 42 92 99 57 90 89 98 34 85 19 60 15 99 79 57
错误输出:57 79 99 15 60 19 85 34 98 90 57 99 92 42 71 67 38 50 90 32 46 65 89 100

原bSearch函数的问题
  • 终止条件错误:多余的lo < a.length-1判断会导致插入到数组末尾的场景无法正确处理,比如当待插入元素是当前已排序部分的最大值时,递归会提前终止。
  • 未找到元素时的返回值不符合约定:insertInOrder函数期望未找到目标值时,返回-(插入位置+1)(参考Java Arrays.binarySearch的返回规则),但原函数直接返回-1,导致插入位置计算错误。
  • 递归终止逻辑不完整:当递归到hi < lo时,没有计算正确的插入位置,直接返回-1。
修复后的bSearch函数
static int bSearch(int[] a, int lo, int hi, int key) {
    // 当hi < lo时,说明未找到元素,插入位置为lo,返回-(lo+1)
    if (hi < lo) {
        return -(lo + 1);
    }
    
    int mid = lo + (hi - lo) / 2; // 避免hi+lo溢出
    
    if (a[mid] == key) {
        return mid;
    } else if (a[mid] > key) {
        return bSearch(a, lo, mid - 1, key);
    } else {
        return bSearch(a, mid + 1, hi, key);
    }
}
修复说明
  1. 修正终止条件:移除多余的lo < a.length-1判断,仅保留hi >= lo作为递归继续的条件;当hi < lo时,直接返回-(lo + 1),明确指示插入位置。
  2. 优化mid计算:用lo + (hi - lo) / 2替代(hi+lo)/2,避免当hi和lo数值较大时出现整数溢出问题。
  3. 明确分支逻辑:将三个if合并为else if结构,确保逻辑覆盖所有情况,同时保证函数始终有返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:55:12