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

求助:二分查找函数始终返回-1而非目标索引,即使元素存在于数组中

二分查找始终返回-1的问题排查

嘿,我马上帮你定位到问题了!你的二分查找函数漏掉了处理目标元素等于中间值的核心分支,这就是明明元素存在却一直返回-1的根源。

问题分析

先看你代码里的关键分支逻辑:

if(x<ar[q]) {
 return(binarysearch(ar,x,p,q));
} else return(binarysearch(ar,x,q+1,r));

当目标值x恰好等于中间元素ar[q]时,代码会直接进入else分支,递归搜索q+1到r的右半区间——而有序数组里这个区间不可能包含当前匹配的元素,最后递归到p==r时自然找不到,返回-1。

二分查找的标准逻辑应该覆盖三种情况:

  • 目标值 < 中间值:搜索左半区间
  • 目标值 == 中间值:直接返回当前中间索引(找到目标)
  • 目标值 > 中间值:搜索右半区间

修正后的代码

补上x == ar[q]的判断分支即可解决问题:

#include <iostream>
using namespace std;

int binarysearch(int ar[],int x,int p,int r) {
 int q;
 if(p==r) {
    if(ar[r]==x) {
        return r;
    } else {
        return -1;
    }
 } else{
    q = p + (r - p)/2; // 优化:避免p+r过大导致溢出
    if(x < ar[q]) {
        return binarysearch(ar, x, p, q);
    } else if(x == ar[q]) { // 新增匹配分支,直接返回索引
        return q;
    } else {
        return binarysearch(ar, x, q+1, r);
    }
 }
}

int main(){
 int ar[10]={1,2,3,4,5,6,7,8,9,10};
 int w;
 cout<<"enter the element to search"<<endl;
 cin>>w;
 int y = binarysearch(ar,w,0,9);
 cout<<y<<" index"<<endl;
 return 0;
}

另外我还优化了中间值q的计算方式:q = p + (r - p)/2,避免当p和r数值较大时,p+r超出int范围导致溢出的问题(虽然你的小数组暂时不会遇到,但这是二分查找的最佳实践)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:28