二分查找算法介绍

2023-05-16

    二分查找算法的实现过程如下:在排序数组中查找某一个数据项,首先让待查数据与中间下标元素开始比较,如果相等则返回,如果小于中间下标元素,重新开始从低位开始,(中间下标-1)结束的数组内,继续执行相同的查找操作,如果大于中间下标元素,重新开始从中间下标+1,高位结束的数组内,继续执行相同的查找操作,直到低位超过高位,如果没有找到,返回-1,如果找到,则返回对应的中间下标。因为每次执行一次查询操作,查找范围会减少一半,所以二分查找也叫折半查找。

    二分查找算法的前提是数组必须是排好序的,如果是乱序的,二分查找不适用。如果是仅仅查找元素是否存在,可以考虑将乱序的数组排序,然后使用二分查找,但是查找的下标不能作为最终计算的依据,只能作为元素存在的依据。

    二分查找的思路很特别,就是不断的从原始数组中进行范围缩小式的查找,基于这种原理,二分查找算法的实现可以使用循环的方式实现,也可以使用递归的方式实现。关键点是计算中间下标,以及算法终止的条件。中间下标计算方式:mid=(low+high)/2,最开始low=0,high=size(array)-1,之后根据比较结果,low或者high会发生变化。终止条件low>high。根据这些思路,我们给出二分查找的示例代码:

#include <iostream.h>
int search_by_loop(int *arr,int low,int high,int item){
	while(low<=high){
		int mid = (low+high)/2;
		cout<<"mid = "<<mid<<endl;
		if(item<arr[mid]){
			high = mid-1;
		}else if(item>arr[mid]){
			low = mid+1;
		}else{
			return mid;
		}
	}
	return -1;
}

int search_by_recursive(int *arr,int low,int high,int item){
	if(low>high)
		return -1;
	int mid = (low+high)/2;
	cout<<"mid = "<<mid<<endl;
	if(item==arr[mid]){
		return mid;
	}else if(item<arr[mid]){
		return search_by_recursive(arr,low,mid-1,item);
	}else{
		return search_by_recursive(arr,mid+1,high,item);
	}
}

void main(){
	int data[] = {1,20,35,45,50,68,99,100,120,200};
	int len = sizeof(data)/sizeof(data[0]);
	int low = 0,high = len-1;
	int index = search_by_loop(data,low,high,99);
	if(index>-1){
		cout<<"found item(99) at "<<index<<endl;
	}else{
		cout<<"not found."<<endl;
	}
	int index2 = search_by_recursive(data,low,high,99);
	if(index2>-1){
		cout<<"found item(99) at "<<index2<<endl;
	}else{
		cout<<"not found."<<endl;
	}
}

    运行程序,打印结果如下所示:

     

    如果查询一个不存在的元素,比如98,结果如下:

   

       关于二分查找在一般的面试中会经常问到,笔试题也会出现,是一个面试基本也是必备的算法。至于它的复杂度,我们可以这样来推算,至少是n/2,但是这还不是最科学的,理论上最坏的情况是所有的折半均执行一次才结束,因此是一个log2(n):以2为底数,n的对数。一般也直接写作log(n)。

    前面的原理说了,二分查找的前提是数组是排序的,所以他的适用范围是有限制的,但是他的应用却是最广泛的,这得益于他的查询效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找算法介绍 的相关文章

  • Tesseract-OCR 字符识别---样本训练

    Tesseract是一个开源的OCR xff08 Optical Character Recognition xff0c 光学字符识别 xff09 引擎 xff0c 可以识别多种格式的图像文件并将其转换成文本 xff0c 目前已支持60多种
  • FPGA与OPENCV的联合仿真

    对于初学者来说 xff0c 图像处理行业 xff0c 最佳仿真方式 xff1a FPGA 43 OPENCV xff0c 因为OPENCV适合商业化 xff0c 适合自己写算法 1 xff09 中间交互数据介质 txt文档 2 xff09
  • 华硕P8Z77-V LX老主板转换卡升级NVMe M2硬盘经验,老主机的福音,质的飞跃

    每年双十一都是淘货升级老家伙的时候 xff0c 今年也不例外 xff0c 随着日子长久 xff0c 软件的增多 xff0c 虽然已经尽量装在系统盘以外的盘 xff0c 但C盘还是日渐不够用 xff0c 从以前的30G系统盘升到60G xff
  • linux 更换 软件源后 GPG错误

    linux 更换 软件源后 GPG错误 linux 软件源 GPG 签名 密钥 linux 更换 软件源后 GPG错误 http my oschina net emptytimespace blog 83633 如文章 1 中提到 xff1
  • ROS2学习笔记(四)-- 用方向键控制小车行走

    简介 xff1a 在上一节的内容中 xff0c 我们通过ROS2的话题发布功能将小车实时视频信息发布了出来 xff0c 同时使用GUI工具进行查看 xff0c 在这一节内容中 xff0c 我们学习一下如何订阅话题并处理话题消息 xff0c
  • flume大数据框架数据采集系统

    flume是cloudera开源的数据采集系统 xff0c 现在是apache基金会下的子项目 xff0c 他是hadoop生态系统的日志采集系统 xff0c 用途广泛 xff0c 可以将日志 网络数据 kafka消息收集并存储在大数据hd
  • flume日志收集系统常见配置

    前面介绍了flume入门实例 xff0c 介绍了配置netcat信源 xff0c 以及memory信道 xff0c logger信宿 xff0c 其实flume常见的信源信道信宿有很多 xff0c 这里介绍flume常用信源的三种方式 xf
  • flume自定义拦截器实现定制收集日志需求

    flume默认提供了timestamp host static regex等几种类型的拦截器 xff0c timestamp host static等拦截器 xff0c 其实就是在消息头中增加了时间戳 xff0c 主机名 xff0c 键值对
  • Eclipse开发mapreduce程序环境搭建

    Eclipse作为一个常用的java IDE xff0c 其使用程度虽然比不上idea那么强大 xff0c 但是对于习惯使用eclipse开发的人来说 xff0c 也不失为一个可以选择的IDE 对于喜欢eclipse开发的人来说 xff0c
  • hdfs常见操作java示例

    我们学习hadoop xff0c 最常见的编程是编写mapreduce程序 xff0c 但是 xff0c 有时候我们也会利用java程序做一些常见的hdfs操作 比如删除一个目录 xff0c 新建一个文件 xff0c 从本地上传一个文件到h
  • MapReduce编程开发之数据去重

    MapReduce就是一个利用分而治之的思想做计算的框架 xff0c 所谓分 xff0c 就是将数据打散 xff0c 分成可以计算的小份 xff0c 治就是将数据合并 xff0c 相同键的数据合并成一个集合 MapReduce并不能解决所有
  • MapReduce编程开发之求平均成绩

    MapReduce计算平均成绩是一个常见的算法 xff0c 本省思路很简单 xff0c 就是将每个人的成绩汇总 xff0c 然后做除法 xff0c 在map阶段 xff0c 是直接将姓名做key 分数作为value输出 在shuffle阶段
  • MapReduce编程开发之数据排序

    MapReduce的数据排序 xff0c 其实没有很复杂的实现 xff0c 默认在shuffle阶段 xff0c MapReduce就帮我们将数据排好序了 xff0c 我们在Map和Reduce阶段 xff0c 无需做额外的操作 MapRe
  • MapReduce编程开发之倒排索引

    倒排索引是词频统计的一个变种 xff0c 其实也是做一个词频统计 xff0c 不过这个词频统计需要加上文件的名称 倒排索引被广泛用来做全文检索 倒排索引最终的结果是一个单词在文件中出现的次数的集合 xff0c 以下面的数据为例 xff1a
  • ROS2学习笔记(五)-- ROS2命令行操作常用指令总结(一)

    简介 xff1a 在前面的章节中 xff0c 我们先简单学习了ROS2的话题发布和订阅 xff0c 两种操作都是通过python代码实现的 xff0c 而在实际应用过程中 xff0c 我们会经常用到命令行操作来辅助调试 xff0c 更进一步
  • 实例演示ElasticSearch索引查询term,match,match_phase,query_string之间的区别

    通常在面试elasticsearch中 xff0c 面试官会问一个关于查询的问题 xff0c 就是term查询和match查询有什么区别 xff1f 如果你对这两个查询不清楚 xff0c 面试官会认为你没有用过elasticsearch x
  • Elasticsearch使用update_by_query

    elasticsearch中有一个方法是批量修改 xff0c 就是先查询出需要修改的索引记录 xff0c 然后批量修改 这个本来没什么 xff0c 但是使用过的都知道 xff0c 用java来调用这个方法很别扭 一般来说 xff0c 我们使
  • C++中实现字符串分隔split方法

    C 43 43 中 xff0c 除了没有直接的求数组长度的方法外 xff0c 也没有直接对字符串分隔的方法 xff0c 需要我们自己来实现 xff0c 下面结合字符串分隔的问题 xff0c 做一个面试题 xff0c 面试题是这样的 xff0
  • c++编程实现简单mapreduce程序

    hadoop提供了java版本的mapreduce编程API xff0c 我们需要自定义编写mapper和reducer xff0c 分别继承Mapper和Reducer xff0c 然后重写map和reduce方法 同时需要在main方法

随机推荐

  • windows下安装MongoDB压缩版

    MongoDB在windows上一般提供msi的安装方式 xff0c 这种安装方式相对简单 xff0c 界面安装 xff0c 这里介绍解压缩版本的安装 xff0c 我们需要下载的是zip包 xff0c 然后解压 xff0c 这里下载之后 x
  • python3安装以及安装pip之后出现的问题

    python3在windows10上的安装 xff0c 为了省事 xff0c 直接下载的是python 3 7 4 embed adm64 zip免安装版本 xff0c 下载解压 xff0c 然后将python目录加入环境变量的path中
  • eclipse安装pydev插件开发python程序

    做Java开发的 xff0c 想学习python xff0c 可以不用安装别的pycharm IDE xff0c 我们直接通过在eclipse中安装一个python插件pydev即可 xff0c 前提是你的机器上已经安装了python xf
  • docker私有镜像服务搭建

    docker容器技术已经在部署服务上使用的非常普遍 xff0c 主要是它的隔离性以及快速启动的特性 xff0c 一般启动一个容器 xff0c 如果镜像不存在会先去dockerhub仓库下载 xff0c 然后存储在本地 xff0c 后续可以继
  • vs2017开发第一个desktop应用程序

    desktop应用程序也叫窗口程序 xff0c 我们平时在电脑上安装的APP xff0c 都是桌面程序 xff0c 比如QQ xff0c 各种播放器 xff0c 包括浏览器 桌面程序最主要的特点 xff0c 就是点击运行之后 xff0c 会
  • 量子编程入门第一篇环境搭建dotnet-sdk+Microsoft.Quantum.IQSharp+python3.6+qsharp

    量子编程已经提上日程 xff0c 微软提供了quantum开发工具包 Microsoft Quantum Development Kit简称QDK xff0c 在visual studio 2019环境下 xff0c 可以安装quantum
  • ROS2学习笔记(十)-- ROS2 launch启动文件

    简介 xff1a 接触过ROS1的同学对launch肯定不陌生 xff0c 在ROS1中 xff0c 我们常用launch实现node和master同时启动 多节点同时启动配置等功能 xff0c ROS2中的launch也是用于多节点启动
  • 记录一次解决TypeError: 'NoneType' object is not callable的办法

    如题所示 xff0c 这是python运行时报错 xff0c 关键信息就是 xff1a TypeError 39 NoneType 39 object is not callable xff0c 错误栈信息如下 xff1a 有的文章提示 x
  • windows下VC++6.0编写c++程序连接mysql示例

    windows下通过c 43 43 编码连接mysql数据库 xff0c 需要做一些设置 xff0c 因为我们需要连接mysql并执行相关操作 xff0c 需要使用mysql提供的api xff0c 这api在mysql h头文件中定义了
  • windows修改cmd命令行字体

    默认情况下 xff0c windows命令行字体只有两种 xff0c 点阵字体和新宋体 如果你想使用系统自带的其他字体 xff0c 需要更改注册表 这里介绍如何修改 windows系统字体在目录C Windows Fonts 下 xff0c
  • centos7安装与配置DNS服务器

    centos7上安装DNS服务器可以实现域名与IP的双向解析 xff0c 即通过域名可以找到主机IP xff0c 也可以通过IP找到域名 在postfix搭建邮件服务器中 xff0c 需要用到DNS正向解析与反向解析 xff0c 因此DNS
  • springboot项目单元测试

    springboot项目和普通的spring项目一样也可以做单元测试 xff0c 一般是测试service层的方法 xff0c 在进行项目构建的时候 xff0c 需要在springboot默认依赖的基础上 xff0c 再加上spring b
  • ipfs星际文件系统初体验

    ipfs是InterPlanetary File System的简称 xff0c 即星际文件系统 xff0c 他不同于一般的操作系统文件系统 xff0c 也不同于分布式文件系统 xff0c 因为分布式文件系统最终访问文件还是采用的http协
  • truffle构建以太坊应用并测试第一个helloworld智能合约

    最近因为国家对区块链又重视起来了 xff0c 相信今年年底到明年年初会是一个区块链的新的爆发点 xff0c 也是碰巧学习了一下以太坊构建区块链应用 xff0c 以前都是简单的了解 xff0c 并没有实际动手演练 今天趁机会也学习一下区块链
  • docker启动报错:standard_init_linux.go:211: exec user process caused "no such file or directory"

    如题所示 xff0c 根据自己构建的镜像启动docker容器 xff0c 直接退出 xff0c 查看容器日志报错信息 xff0c 没有任何别的信息 网上搜索这个问题 xff0c 发现很多人都遇到过 xff0c 解决办法也各不相同 xff0c
  • windows下telnet回显解决办法

    telnet相信大家都用过 xff0c 在tcp连接中 xff0c 我们可以用来模拟发送客户端请求 xff0c 当我们输入telnet 127 0 0 1 8888连接本机的tcp 8888端口时 xff0c 连接成功后 xff0c 会进入
  • springboot与flyway集成做数据迁移

    flyway是一种用来做数据迁移的框架 xff0c 如果你的项目不是jpa 43 hibenate xff0c 比如使用的mybatis xff0c 那么你需要在实体创建之前 xff0c 在数据库中生成表结构 xff0c 然后逆向工程 xf
  • ROS2学习笔记(十一)-- ROS2 bag数据记录与回放

    简介 xff1a ROS2提供了ros2 bag命令 xff0c 可以记录指定主题的数据到文件中 xff0c 也可以将记录下的内容再发布出来 xff0c 相当于是数据的回放 xff0c 除了通过命令行的方式实现数据记录以外 xff0c 也可
  • C++实现简单链表

    链表是最常用的一种数据结构 xff0c 无论什么语言 xff0c 学习数据结构 xff0c 都绕不开链表 xff0c 下面通过c 43 43 来实现简单链表 xff0c 所谓简单链表 xff0c 就是构建链表 xff0c 然后遍历打印链表
  • 二分查找算法介绍

    二分查找算法的实现过程如下 xff1a 在排序数组中查找某一个数据项 xff0c 首先让待查数据与中间下标元素开始比较 xff0c 如果相等则返回 xff0c 如果小于中间下标元素 xff0c 重新开始从低位开始 xff0c 中间下标 1