我的二进制搜索代码有什么问题?

时间:2021-04-22 08:37:52

标签: c++

#include<iostream>

using namespace std;
void bi(int k,int l,int r,int arr[]){
    int m=r-l/2;
    if(arr[m]==k)
    {
        cout<<"found at"<<m;
    }
    if(arr[m]<k)
    {
        bi(k,m+1,r,arr);
    }
    if(arr[m]>k)
    {
        bi(k,l,m-1,arr);
    }
}

int main(){
    int n;
    cout<<"enter size of array";
    cin>>n;
    int arr[n];
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }
    int k;
    cout<<"enter number to be searched";
    cin>>k;
    bi(k,0,n-1,arr);
    return 0;
}

此代码有效,但我在其他网站上看到他们使用 mid = l + (r - l) / 2; 为什么我们可以直接编写 r-l/2。他们也使用了 if(r<=l),但代码没有这两个也能工作。我知道这是一个非常愚蠢的简单问题,但我想清除我的基础知识。

1 个答案:

答案 0 :(得分:0)

“binary”中的“bi”来自将区间分割成两个等大的区间。你的代码没有这样做。为了使它工作,两个大小都不是绝对必要的,但它会影响结果的复杂性,具体取决于结果的哪一边。我也不确定你的间隔是否真的收敛了。

这个m

int m=r-l/2; 

不在 lr 之间,但在 mid = l + (r - l) / 2; 之间。

<块引用>

他们也使用了 if(r<=l) 但是代码没有这两个就可以工作。

那是因为您的代码假定该元素始终存在。如果情况并非如此,您的代码将无法工作。如果该元素不存在,您最终会到达 r <= l,但 arr[m]==kfalse。停止算法一个停止条件ala

if (r <= l) return arr[l];

if (r <= l) throw "element not found";

需要。