折半查找:
每次将待查元素所在范围减少一半,只适用于有序表,且限于顺序存储结构(对线性链表无效)
折半查找就是设定两个端点low和high,比较两端点中间元素mid关键字与给定值key的大小从而来取舍区间。
mid=(low+high)/2 (不能整除的情况向下取整)
若key<mid,则high=mid-1,舍弃mid右边区间
若key>mid,则low=mid+1,舍弃mid左边区间
当key==mid时,找到
当high<mid,结束
//非递归
int Search_Bin(SSTable ST,KeyType key){
low=1;high=ST.length;
while(low<=high){
mid=(low+high)/2;
if(ST.R[mid].key==key) return mid;
else if(key<ST.R[mid].key)
high=mid-1;
else low=mid+1;
}
return 0;
}
//递归
int Search_Bin(SSTable ST,KeyType key,int low,int high){
if(low>high) return 0;
mid=(low+high)/2;
if(key==ST.R[mid].key) return mid;
else if(key>ST.R[mid].key) return Search_Bin(ST,key,mid+1,high);
else return Search_Bin(ST,key,low,mid-1);
}
性能分析:
如果将表中全部元素关键字以二叉排序树的形式画出来,可以发现折半查找在查找成功的情况下比较次数等于经过的路径上的结点数或者说待查结点所在的层数,由此得比较次数不会超过树的深度;查找失败的情况下比较次数也不会超过树的深度。
设每个元素查找概率相等,表长n=-1,h为深度=log2(n+1)的满二叉树,则
ASL(成功时)={log2(n+1) }-1 (n>50)