折半查找(二分查找)

折半查找(二分查找)

  • 折半查找(Binary Searh) 也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构, 而且表中元素按关键字有序排列。在下面及后续的讨论中,均假设有序表是递增有序的。
  • 折半查找的查找过程为:从表的中间记录开始, 如果给定值和 中间记录的关键字相等, 则查找成功;如果给定值大于或者小千中间记录的关键字,则在表中大于或小千中间记录的那一半中查找,这样重复操作, 直到查找成功或者在某一步中查找区间为空, 则代表查找失败。
  • 折半查找每一次查找比较都使查找范围缩小一半,与顺序查找相 比,很显然会提高查找效率。
  • 为了标记查找过程中每一次的查找区间,下面分别用low和high来表示当前查找区间的下界和上界,mid为区间的中间位置。
    【算法步骤】
    1 :置查找区间初值,low 为 1,high为表长。
    2 :当 low 小于等于 high 时, 循环执行以下操作:
    • mid取值为 low 和 high 的中间值;
    • 将给定值key与中间位置记录的关键字进行比较,若相等则查找成功,返回中间位置 mid ;
    • 若不相等则利用中间位置记录将表对分成前、后两个子表 。如果 key 比中间位置记录
    的关键字小,则 high 取为 mid - 1 , 否则 low 取为 mid + l 。
    3 :循环结束,说明查找区间为空,则查找失败,返回 0。
    【算法描述】
int Search_Bin(SSTable ST, KeyType key)
{
    //在有序表ST中折半查找其关键字等于key的数据元素。若找到, 则函数值为该元素在表中的位置, 否则为0
    low = l;
    high = ST.length; //置查找区间初值
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (key == ST.R[mid].key)
            return mid; //找到待查元素
        else if (key < ST.R[mid].key)
            high = mid - 1; //继续在前一子表进行查找
        else
            low = mid + l; //继续在后一子表进行查找
        return 0;
    }

  • 本算法很容易理解,唯一需要注意的是,循环执行的条件是 low <= high , 而不是low < high,因为 low = high 时,查找区间还有最后一个结点,还要进一步比较 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值