c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...
折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
折半查找算法
对静态查找表{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语言实现...相关推荐
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- 折半查找的思想及源码_二分查找及对应的几道经典题目
二分查找(Binary Search)属于七大查找算法之一,又称折半查找,它的名字很好的体现出了它的基本思想,二分查找主要是针对的是有序存储的数据集合. 假设有一个集合和一个待查找的目标值,每次都通过 ...
- c语言二分法查找一个数_算法简解-二分查找
读书不记录=没读,始终是我的信条·····最近因为要参加竞赛,发现自己真的差的很远,所以打算重新开始学习一遍算法及AI的相关数学知识,相信很多人都是闻数学,理工科色变,之前也是觉得上数理课太难了,真的 ...
- java二分查找递归_java学习之—递归实现二分查找法
/** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...
- python实现二分查找_数据结构和算法:Python实现二分查找(Binary_search)
在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下.而二分查找的效率往往会比线性查找更高. 一. ...
- 【数据结构与算法】task3 排序二分查找
排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...
- 第一天学习笔记之数组(冒泡排序+二分查找)
为了更深理解ArrayList实现原理,从今天开始学习算法和数据结构,更好的掌握底层原理. 在实际的项目工作过程中,数组已经很少用到,被各种封装的第三方类占据我们的程序中 但是要想写出优雅的代码,第三 ...
- python二分查找算法_如何使用python的二分查找算法
如何使用python的二分查找算法 发布时间:2020-11-18 09:27:29
- [PTA] 数据结构与算法题目集 6-10 二分查找
Position BinarySearch(List L, ElementType X) {int beg = 1;int end = L->Last;while (beg <= end) ...
最新文章
- 逻辑结构图向关系转换规则3
- python for循环求和_python用for循环求和的方法总结
- 深入浅出谈cuda 书_入门和基础——9本关于美学的书
- 埃及分数问题——迭代加深搜索
- 为什么有的SAP CRM系统的产品搜索页面上会显示小红叉
- linux如何移动数据到文件系统,怎么把数据文件从文件系统移动到asm?
- java spi机制_Java是如何实现自己的SPI机制的? JDK源码(一)
- 华为手机记事本导出_深夜浅谈怎样用一部手机做电影解说?
- access用扫描枪输入_判断是否扫码枪输入的通用函数源码
- 分类与回归机器学习模型的评价指标
- 三大无线技术 —— WiFi、蓝牙、HomeRF(无线网卡、WPAN)
- Linux运维(三)
- 安装完office没有图标_很多人不会设置路由器?只因没有弄懂安装顺序,看完你就会了...
- Android嵌入式组态软件
- keil5怎么放大字体_keil4调节字体 keil字体放大快捷键
- 如何安装最新版质性分析软件NVIVO?
- 深入剖析jsonp跨域原理
- 注意啦,还没有支持64位系统的App开发者,务必在12月底前完成这件事
- electron (二) 暗黑模式
- 报错 Missing number, treated as zero. \begin{subfigure}{0.24\linewidth}?怎么解决
热门文章
- SVN的作用有哪些?
- Cocos2d-x 3.9 + VS2012 + BabeLua 如何搭建cocos2dx lua环境
- oracle把表移到另一个表空间,将表迁移至其他表空间
- 设置Mac 终端走代理
- yac+redis+db做波式缓存
- 淘宝大促页面性能监控和优化实践
- 和python哪个容易胖_吃肉和吃饭,哪个更容易长胖?
- HDUOJ入坑的第一天--------1002题(计算A+B)
- 泰国.寂静的普吉岛(图片欣赏)
- asp.net怎么写上传图片到mysql的页面_【web安全】文件上传漏洞