折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。

折半查找算法

对静态查找表{5,13,19,21,37,56,64,75,80,88,92}采用折半查找算法查找关键字为 21 的过程为:

如上图 1 所示,指针 low 和 high 分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 low 和 high 指针中间位置的关键字。在查找的过程中每次都同 mid 指向的关键字进行比较,由于整个表中的数据是有序的,因此在比较之后就可以知道要查找的关键字的大致位置。

例如在查找关键字 21 时,首先同 56 作比较,由于21 < 56,而且这个查找表是按照升序进行排序的,所以可以判定如果静态查找表中有 21 这个关键字,就一定存在于 low 和 mid 指向的区域中间。

因此,再次遍历时需要更新 high 指针和 mid 指针的位置,令 high 指针移动到 mid 指针的左侧一个位置上,同时令 mid 重新指向 low 指针和 high 指针的中间位置。如图 2 所示:

同样,用 21 同 mid 指针指向的 19 作比较,19 < 21,所以可以判定 21 如果存在,肯定处于 mid 和 high 指向的区域中。所以令 low 指向 mid 右侧一个位置上,同时更新 mid 的位置。

当第三次做判断时,发现 mid 就是关键字 21 ,查找结束。

注意:在做查找的过程中,如果 low 指针和 high 指针的中间位置在计算时位于两个关键字中间,即求得 mid 的位置不是整数,需要统一做取整操作。

折半查找的代码:

int BinarySearch(SeqList &L ,int x) {

int low = 0, high = L.length - 1, mid;

while (low<=high)

{

mid = (low + high) / 2;//找中间值

if (L.data[mid]==x)//先与中间值比较

{

return mid;//相等就返回其值

}

else if (L.data[mid]

{

low = mid + 1;

}

else//如果中间值大于x,则向前半段查找

{

high = mid - 1;

}

}

return -1;//如果没有找到,返回-1

}

折半查找的时间复杂度

分析:搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半

时间复杂度计算:

总共有n个元素。

如果知道n = 1,则t(n) = c1;

如果n > 1,则t(n) = t(n/2) + c2

其中n/2需要取整,c1、c2都是常数

第1次折半:还剩n/2个元素

第2次折半:还剩n/4个元素

第3次折半:还剩n/8个元素

……

第k次折半:还剩n/2^k个元素

最坏的情况下,最后还剩1个元素,令n/2^k = 1。得k=log2(n)。

时间复杂度O(logn)

总结

通过比较折半查找的平均查找长度,同前面介绍的顺序查找相对比,明显折半查找的效率要高。但是折半查找算法只适用于有序表,同时仅限于查找表用顺序存储结构表示。

参考文章

此文章在参考文章上做了算法的最简化和时间复杂度的分析

c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...相关推荐

  1. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  2. 折半查找的思想及源码_二分查找及对应的几道经典题目

    二分查找(Binary Search)属于七大查找算法之一,又称折半查找,它的名字很好的体现出了它的基本思想,二分查找主要是针对的是有序存储的数据集合. 假设有一个集合和一个待查找的目标值,每次都通过 ...

  3. c语言二分法查找一个数_算法简解-二分查找

    读书不记录=没读,始终是我的信条·····最近因为要参加竞赛,发现自己真的差的很远,所以打算重新开始学习一遍算法及AI的相关数学知识,相信很多人都是闻数学,理工科色变,之前也是觉得上数理课太难了,真的 ...

  4. java二分查找递归_java学习之—递归实现二分查找法

    /** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...

  5. python实现二分查找_数据结构和算法:Python实现二分查找(Binary_search)

    在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下.而二分查找的效率往往会比线性查找更高. 一. ...

  6. 【数据结构与算法】task3 排序二分查找

    排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...

  7. 第一天学习笔记之数组(冒泡排序+二分查找)

    为了更深理解ArrayList实现原理,从今天开始学习算法和数据结构,更好的掌握底层原理. 在实际的项目工作过程中,数组已经很少用到,被各种封装的第三方类占据我们的程序中 但是要想写出优雅的代码,第三 ...

  8. python二分查找算法_如何使用python的二分查找算法

    如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29

  9. [PTA] 数据结构与算法题目集 6-10 二分查找

    Position BinarySearch(List L, ElementType X) {int beg = 1;int end = L->Last;while (beg <= end) ...

最新文章

  1. 逻辑结构图向关系转换规则3
  2. python for循环求和_python用for循环求和的方法总结
  3. 深入浅出谈cuda 书_入门和基础——9本关于美学的书
  4. 埃及分数问题——迭代加深搜索
  5. 为什么有的SAP CRM系统的产品搜索页面上会显示小红叉
  6. linux如何移动数据到文件系统,怎么把数据文件从文件系统移动到asm?
  7. java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)
  8. 华为手机记事本导出_深夜浅谈怎样用一部手机做电影解说?
  9. access用扫描枪输入_判断是否扫码枪输入的通用函数源码
  10. 分类与回归机器学习模型的评价指标
  11. 三大无线技术 —— WiFi、蓝牙、HomeRF(无线网卡、WPAN)
  12. Linux运维(三)
  13. 安装完office没有图标_很多人不会设置路由器?只因没有弄懂安装顺序,看完你就会了...
  14. Android嵌入式组态软件
  15. keil5怎么放大字体_keil4调节字体 keil字体放大快捷键
  16. 如何安装最新版质性分析软件NVIVO?
  17. 深入剖析jsonp跨域原理
  18. 注意啦,还没有支持64位系统的App开发者,务必在12月底前完成这件事
  19. electron (二) 暗黑模式
  20. 报错 Missing number, treated as zero. \begin{subfigure}{0.24\linewidth}?怎么解决

热门文章

  1. SVN的作用有哪些?
  2. Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境
  3. oracle把表移到另一个表空间,将表迁移至其他表空间
  4. 设置Mac 终端走代理
  5. yac+redis+db做波式缓存
  6. 淘宝大促页面性能监控和优化实践
  7. 和python哪个容易胖_吃肉和吃饭,哪个更容易长胖?
  8. HDUOJ入坑的第一天--------1002题(计算A+B)
  9. 泰国.寂静的普吉岛(图片欣赏)
  10. asp.net怎么写上传图片到mysql的页面_【web安全】文件上传漏洞