查找算法:折半查找

折半查找,也称二分查找,是一种效率较高的查找方法。

要求线性表必须采用 顺序结构,表中元素按关键字 有序排列。

int Search_Bin (SSTable ST, KeyType key) {
  int low = 1, high = ST.length;
  while (low <= high) {  // 注意不是low<high,因为low=high时,查找区间还有最后一个结点,还要进一步比较
    int mid = (low + high) / 2;
    if (ST[mid].key == key) return mid;
    else if (ST[mid].key > key) high = mid - 1;
    else (ST[mid].key < key) low = mid + 1;
  }
  return 0;
}

注:该算法可改为递归实现

算法分析:
折半查找过程可用二叉树来描述,结点值不是记录的关键字,二是记录在表中的位置序号。
把当前查找区间的中间位置作为根,左子表和右子表分别作为根的左子树和右子树,由此得到的二叉树称为折半查找的 判定树
1
借助判定树,易得折半查找的平均查找长度。

假设有序表的长度n=2h1,则判定表的深度h=log2(n+1)的满二叉树。
树中层次为1的结点有1个,层次为2的结点有2个,...,层次为h的结点有2h1个。
平均查找长度

ASL=i=1nPiCi=inj=1hj·2j1=n+1nlog2(n+1)1

当n较大时,可有下列近似结果ASL=log2(n+1)1

优点:比较次数少,查找效率高
缺点:对表结构要求高,只能用于顺序存储的有序表。查找前需要排序,排序本身也会消耗时间。为保持有序性,插入和删除时,也需耗时运算。
因此, 折半查找不适用于数据元素经常变动的线性表

posted @   aguo718  阅读(1981)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示