目录
下一篇:查找之分块查找
又叫二分查找,仅适用于有序顺序表(链表不行)
low在表头,high在表尾,mid=(low+high)/2或者low+(high-low)/2
代码:
//二分查找
//SSTable是有序表,key是关键字可以是任意类型
int Binary_Search(SSTable L,int key){
int low=0,high=L.TableLen-1,mid;
while(low<=high){
//计算每轮的mid
mid=(low+high)/2;
//若mid就是key则返回
if(L.elem[mid]==key){
return mid;
}
//如果mid大于key说明key在mid左边,将high=mid-1
else if(L.elem[mid]>key){
high=mid-1;
}
否则key就在mid右边
else{
low=mid+1;
}
}
若low>high了说明没找到
return -1;
}
效率分析:
紫色方框是查找失败
每一层代表比较一次
构造查找判定树
注意:一定是右边的多
特性:折半查找判定树一定是平衡二叉树
只有最下面一层是不满的因此,元素个数为n时树高为h=[log2(n+1)]
若没有失败结点分析查找效率
小结:
思考:
大部分情况下折半查找都比顺序查找效率高,但是不是任何情况效率都比顺序查找高,比如查找元素就在第一个。
若mid取值是向上取整则,在构造判定树时左边子树结点数-右边子树结点数=1或0