求助:二分查找函数始终返回-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
相关产品推荐
相关产品推荐

