二分查找(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)(参考JavaArrays.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); } }
修复说明
- 修正终止条件:移除多余的
lo < a.length-1判断,仅保留hi >= lo作为递归继续的条件;当hi < lo时,直接返回-(lo + 1),明确指示插入位置。 - 优化mid计算:用
lo + (hi - lo) / 2替代(hi+lo)/2,避免当hi和lo数值较大时出现整数溢出问题。 - 明确分支逻辑:将三个if合并为else if结构,确保逻辑覆盖所有情况,同时保证函数始终有返回值。
内容的提问来源于stack exchange,提问作者Fatimah
相关产品推荐
相关产品推荐

