二分查找原理很简单,但是往往我们开始敲代码的时候,会遇到一些小问题,不过每个人处理的方式不一样,我这里仅供参考。
template<class T> T binarySearch(T *num,int len,T e ){
int middle,left = 0,right = len-1;
while(left<right){
middle =(left+right)>>1;
if(num[middle]==e)
return middle;
else if(num[middle]>e)
right = middle-1;
else
left = middle+1;
}
cout<<"can't find this element"<<endl;
return 0;
}
int main(){
const int len = 7;
int a[len]={1,2,3,6,6,7,10};
int p = binarySearch(a,len,7);
cout<<p<<endl;
return 0;
}
运行结果
5
但是当我寻找10的时候,即int p = binarySearch(a,len,10)
运行结果
can’t find this element
0
这就出现问题了。
究其原因,是因为每一次把left和right的范围缩小之后,我们是摒弃掉了已经比较过的num[middle],所以新的left需要middle+1,新的right需要middle-1,而最后,能够return 正确的middle的时候,必定是left = right的时候,所以代码这样改之后,不会出错了
template<class T> T binarySearch(T *num,int len,T e ){
int middle,left = 0,right = len-1;
while(left<=right){ //每一次比的范围都是[left,right],所以带“=”
middle =(left+right)>>1;
if(num[middle]==e)
return middle;
else if(num[middle]>e)
right = middle-1;
else
left = middle+1;
}
cout<<"can't find this element"<<endl;
return 0;
}
int main(){
const int len = 7;
int a[len]={1,2,3,6,6,7,10};
int p = binarySearch(a,len,10);
cout<<p<<endl;
return 0;
}
运行结果
6