二分查找函数总是返回 -1 值而不是索引

Posted

技术标签:

【中文标题】二分查找函数总是返回 -1 值而不是索引【英文标题】:binary search fuction always returns -1 value instead of index 【发布时间】:2018-01-29 13:45:56 【问题描述】:

即使数组中存在数据,我的 Binarysearch 函数也始终返回 -1 而不是索引。谁能帮我解决问题

int main()

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

    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 = ((r+p)/2);
              if(x<ar[q])
                 
                     return(binarysearch(ar,x,p,q));
                 
                  else
                    return(binarysearch(ar,x,q+1,r));
    


    

【问题讨论】:

如果有人投了反对票,请给我建议我如何以更好的方式提出这个问题 如果x == ar[q],您以一种将q 排除在进一步考虑之外的方式递归调用binarysearch。实际上,您确保该元素不会被找到。 先生如何进行适当的更正 通常在您喜欢的文本编辑器中打开源文件,然后使用键盘进行更改。如果这是你的要求,我不会为你做作业。 见:How to debug small programs。 【参考方案1】:

您的代码几乎是正确的。

问题在于if(x&lt;ar[q])

考虑数组:

int arr[11] = 0 10 20 30 40 50 60 70 80 90 100

它的索引是:

0 1 2 3 4 5 6 7 8 9 10

考虑用户传递w=50,中间索引q计算为5

条件if(x&lt;ar[q]) 将为假,因为 50 不小于 50。所以它的 else 部分,即return(binarysearch(ar,x,q+1,r)); 将被运行,即return(binarysearch(ar,50,6,10)); 这里代码走错了方向。我们开始查找错误的子数组。

我们正在寻找的项目50 在第一个子数组中,即0 10 20 30 40 50,而不是在第二个子数组中,即60 70 80 90 100

修复代码的一种方法是将条件if(x&lt;ar[q]) 设为if(x&lt;=ar[q])。或者您可以添加另一个 if 条件来检查是否相等并根据其他 if 的要求调整 q。

【讨论】:

以上是关于二分查找函数总是返回 -1 值而不是索引的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode -- 搜索插入位置(35)(二分查找)

二分算法

二分法查找

算法_二分查找

学习数据结构笔记(15) --- [二分查找算法(非递归)]

二分查找偶数