假设表中元素是有序的,将表的中间位置的关键字与所需的关键字比较,相等则成功,否则分为前后两个子表,若所需的值大于中间元素,则在后半部分查找,否则在前半部分查找。重复上述过程,直到查询到结果。
优点:比较次数少,速度快
缺点:要求待查表为有序表。
时间复杂度:O(h)=O(log2n)
c/c++代码实现:
方法一:循环
int binsearch(SeqList *R,int n,KeyType K)
{
int low=0;
int higt=n-1;
int mid;
while(low<=high){
if(K==R[low].key)
return low;
if(K==R[high].key)
return high;
mid=low+(high-low)/2;
/*使用(low+high)/2会有整数溢出的问题
(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)
不存在这个问题*/
if(K==R[mid].key)
return mid;
if(K>R[mid].key){
low=mid+1;
}
else
high=mid-1;
}
if(low>high)
return -1;
}
这份代码注意到了很多问题,比如mid的溢出问题,就非常仔细。
还有对头尾进行一个判断,而不是只判断中间。这样能够提高效率。
方法二:递归
#include <iostream>
using namespace std;
int a[10]={1,2,3,4,5,6,7,8,9,10};
int k;
int binsearch(int low, int high){
int mid=low+(high-low)/2;
if(low>high)
return -1;
if(a[low]==k)
return low;
else if(a[high]==k)
return high;
else if(a[mid]==k)
return mid;
else{
if(k>=a[mid])
binsearch(mid+1, high);
else
binsearch(low, mid-1);
}
}
int main(){
cin>>k;
cout<<binsearch(0,9)<<endl;
return 0;
}