折半查找定义:先确定待查找记录所在范围,然后逐步缩小范围直到找到或找不到记录为止
low,high 分别为待查找范围的上界和下界,指针mid指示区域的中间位置,折半查找的范围其实就是用mid不断更新low或者high的位置,直到找到目标值,注意查找之前需要确保表是有序的
mid=(low+high)/2
设目标值为key;当key<mid时 则更新high=mid-1;此时范围为[low,mid-1]
当key>mid时,则更新low=mid+1;此时范围为[mid+1,high]
当low>high时 则查找失败;
C语言实现折半查找:
int binary_search(int[] a,int key){
int low=0;
int high=sizeof(a)/sizeof(a[0])-1;
int mid=(low+high)/2;
while(low<=high){
if(a[mid]<key){
low=mid+1;
}else if(a[mid]>key){
high=mid-1;
}else {
return a[mid];
};
mid=(low+high)/2;
}
return -1;
}
折半查找的效率分析:
折半查找过程可以看做是一个二叉树,因此折半查找成功进行比较的关键字个数最多不超过树的深度;故折半查找在查找成功时和给定值进行比较的关键字个数不超过 log(2底数)n+1;
平均长度:
h=log2(底数)n+1;
ASL=1/n(1*2^(1-1)+2*2^(2-1)+...+j*2^(j-1)+h*2^(h-1))=((n+1)log2(底数)(n+1)/n)-1 其中j为第j层,也为查找到j层的已经比较过的关键字个数, 2^(j-1)为第i层的结点数j*2^(j-1)为第j层所有节点点的查找个数之和
当n>50时
ASL=log2(底数)(n+1)-1;