数据结构与算法——二分查找
目录
前言
一、二分查找是什么?
二、代码示例
三、算法时间复杂度
总结
前言
二分查找是一种高效的查找算法,二分查找又称为折半查找,其输入是一个有序(升序或降序)的元素列表。本文通过具体的例子来说明什么是是二分查找。
一、二分查找是什么?
二分查找是一种高效的查找算法。下面的实例说明了二分查找的实现原理。我随便想一个1~100的数字,你的目标是以最少的次数猜到这个数字。你每次猜测后,我会提示说大了、小了或对了。假定你从1开始往上猜(当然实际上谁都不会从1开始去猜),那么猜测过程会是下面这样。
很显然,从前往后去猜,这是一种非常糟糕的猜想策略。如果我想的数字100,你得猜100次才能猜到。通常我们会这么去猜,第一次的猜测值是中间数,如50,后面的猜测每次都是确定区间的中间值(如51~100的中间值75),猜测的过程如下图所示。
以上就是二分查找算法的实现原理,每次猜测都会排除一半的数字,非常高效。所以上面的游戏不管我心里想的是哪个数字,你在7次之内都能猜得到。
二、代码示例
#include<stdio.h>#define TRUE 1
#define FALSE 0
typedef int Status;//二分查找
//num 待查找的有序序列
//n 序列的长度
//x 待查找的元素
//返回值:找到了,返回TRUE;未找到,返回FALSE
Status binary_search(int *num,int n,int x)
{int low = 0;int high = n -1;int mid,guess;while(low<=high){mid = low + (high - low)/2;if(x < num[mid])high = mid -1;else if(x > num[mid])low = mid + 1;else{printf("找到了\n");return TRUE;}}printf("没找到\n");return FALSE;
}int main(void)
{int a[5] = {1,2,3,4,5};int b = binary_search(a,5,6);printf("%d\n",b);system("pause");//防止运行结束闪退return 0;
}
程序运行结果如下:
查找的元素6不在序列中,因此返回值为0。
大家可以自行修改测试数据进行测试。
三、算法时间复杂度
算法的时间复杂度通常用大O表示法表示,如上面的例子,二分查找算法所需要的的运行时间为 (以2为底100的对数,约为7),所以最多需要7次可以猜到。延伸到一般情况,算法复杂度为 ,通常我们记作。
普通查找算法时间复杂度为:
二分查找算法时间复杂度为:
两种算法的时间复杂度对比如下:
显然二分查找算法的效率更优于普通查找算法。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了二分查找算法,并通过实例让大家更好的理解该算法。
数据结构与算法——二分查找相关推荐
- 数据结构与算法——二分查找与二叉排序树
文章目录 1.预备知识 1.1 题目目录 1.2 二分查找 1.3 递归二分查找 1.4 循环二分查找 1.5 二叉查找(排序)树 1.6 二叉搜索树的代码实现 2.搜索插入位置 2.1 题目描述 2 ...
- 数据结构与算法 | 二分查找
假如我们在图书馆中整理书记,书按照序号有序排序,序号不连续,当我们需要从书堆中找到特定序号的书时,如果一本一本查找的话,我们可能需要查找N次.但如果我们先找到中间的书,将书分成两堆,与待查书对比,待查 ...
- 数据结构与算法——二分查找与二叉查找树汇总整理
目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
- 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)
数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...
- 数据结构与算法-查找算法(二分查找,插值查找,斐波那契(黄金分割法)查找)
查找算法 以下三种算法的基本思想相同,都是利用递归来寻找 二分查找 思路分析 1.首先确定该数组的中间下标,min = (left + right) / 2 2.然后让需要查找的的数findVal和a ...
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
- Java数据结构与算法 线性查找和二分查找
查找 查找(searching)是在一组数据项中找到指定的目标元素(target element)或者判定组内不存在目标的过程.要查找的数据项组有事成为查找池(search pool). 在此讨论两种 ...
- 数据结构三大查找算法(二分查找、插值查找、斐波那契数列查找)C语言实现
文章目录 查找 二分查找(折半查找) 插值查找 斐波拉契查找 总结: 查找 查找是在大量的信息里面寻找一个特定的信息元素 (1)静态查找和动态查找: 静态或者动态都是针对查找表而言的.动态表指查找表中 ...
最新文章
- centos java程序_刚得到一台centos7服务器,作为Java程序员应该做的事
- 系统建设或应用提供的目标或愿景性场景
- [别被脱库]—数据库的初恋~
- MainService流程
- VS2010附加进程调试DLL时断点无法断下的解决方法
- Makefile文件(四)_书写命令
- 视频数据训练太慢?试试UT-AustinFAIR提出的多重网格训练,加速4.5倍,还能提点!...
- 机器学习——数据预处理
- 如何使用python编程画图_【Python开发】使用python中的matplotlib进行绘图分析数据...
- python樱桃小丸子_appium+python自动化框架搭建
- linux中生成考核用的NTFS文件系统结构样例(一)
- IBM系统分析——领域建模
- Minimax算法及实例分析
- excel两列数据对比找不同_Excel找出不同数据
- QT widget宽高比
- 东京中文离线地图App上线
- Vacuum tube 真空管/电子管
- cf英文名字格式好看的_cf好看的英文名字格式:、I (~) you ?
- 关于世博会的一些遐想!
- 微信开发:解决IOS端下面的点击延迟问题