- 折半查找又称二分查找,适用有序的顺序表。(附:笔试考察查找,这个是经典查找法)
基本思路:首先给定值key与表中中间位置元素的关键字,若相等则查找成功,返回位置。若不等,则所需查找的元素只能在中间元素外的前半部分或后半部分中。缩小范围,递归查找。
2.折半查找的代码
int Binary_Search(Seqlist L, ElemType key){ //假设从小到大
//在有序表中查找关键字key, 若存在则返回其位置,不存在则返回-1
int low=0, high=L.TableLen-1,mid;
while(low<=high){
mid = (low+high)/2; //取中间位置
if(L.elem[mid]==key)
return mid;
else if(L.elem[mid]>key)
high = mid-1; //从前半部分继续查找
else
low = mid+1; //从后半部分寻找
}
return -1;
}
3.示意图
4.平均查找长度
ASL(成功) = 1/n(1*1+2*2+......h*2(h-1))=(n+1)/n*log(n+1)-1=log(n+1)-1
以该例计算一下
ASL(成功) = (1*1+2*2+3*3)/6 = 7/3 (1次成功的节点1个,2次成功的节点2个,3次成功的节点3个)
ASL(不成功) = (3*1+4*6)/7 = 27/7 (3次不成功的节点1个,4次不成功的节点6个)
由代码就可以看出,折半查找只适合线性表,不适合链表,且要求元素按关键字有序。