#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)
,但代码没有这两个也能工作。我知道这是一个非常愚蠢的简单问题,但我想清除我的基础知识。
答案 0 :(得分:0)
“binary”中的“bi”来自将区间分割成两个等大的区间。你的代码没有这样做。为了使它工作,两个大小都不是绝对必要的,但它会影响结果的复杂性,具体取决于结果的哪一边。我也不确定你的间隔是否真的收敛了。
这个m
:
int m=r-l/2;
不在 l
和 r
之间,但在 mid = l + (r - l) / 2;
之间。
他们也使用了 if(r<=l) 但是代码没有这两个就可以工作。
那是因为您的代码假定该元素始终存在。如果情况并非如此,您的代码将无法工作。如果该元素不存在,您最终会到达 r <= l
,但 arr[m]==k
是 false
。停止算法一个停止条件ala
if (r <= l) return arr[l];
或
if (r <= l) throw "element not found";
需要。