为什么这段Java二分查找代码在VS Code编辑器中无法执行?
问题排查与修复
你的代码存在5个核心错误,以下是逐点说明:
- 1、二分查找的前置要求是查询数组必须为有序数组,你当前使用的测试数组
{2,45,-21,56,23}是乱序状态,无法用二分查找得到正确结果。 - 2、语法错误:你贴出的代码末尾多了一个多余的闭合大括号,会直接触发编译失败。
- 3、mid计算逻辑错误:你写的
mid=start+end/2不符合运算优先级,会先计算end/2再和start相加,正确的计算方式是mid = start + (end - start) / 2,该写法同时可以避免两个大int相加的溢出问题。此外mid计算必须放在while循环内部,每次区间调整后重新计算新的中间位置,你现在只在进入循环前计算一次mid,完全无法适配调整后的查找区间。 - 4、区间边界调整逻辑完全错误:当target小于中间值时,应该调整右边界
end = mid - 1,而不是修改mid的值;当target大于中间值时,应该调整左边界start = mid + 1,你当前的写法只会修改mid,不会改变start和end的值,会直接陷入死循环甚至触发数组索引越界。 - 5、Java规范要求类名必须和文件名完全一致,你的类名为
binsearch,则保存的代码文件名必须为binsearch.java,否则会触发编译错误。
修正后的完整代码
public class binsearch { public static void main(String args[]) { // 先对数组排序,满足二分查找的有序要求 int arr[]={2,45,-21,56,23}; java.util.Arrays.sort(arr); int target=45; int answer=binarysearch(arr, target); System.out.println(answer); } static int binarysearch(int arr[],int target) { int start=0; int end=arr.length-1; // mid放在循环内每次计算 while(start<=end) { int mid=start + (end - start)/2; if(target<arr[mid]) { // 调整右边界 end=mid-1; } else if(target>arr[mid]) { // 调整左边界 start=mid+1; } else { return mid; } } return -1; } }
内容的提问来源于stack exchange,提问作者Rachel Peters
相关产品推荐
相关产品推荐

