二分查找--图文详解

二分查找

  • 1. 什么是二分查找
  • 2. 原理
  • 3. 例子
    • 3.1 当数组长度为奇数
    • 3.1 当数组长度为偶数
    • 3.3 实现过程
  • 4. 顺序查找与二分查找的区别
  • 结束语

1. 什么是二分查找

二分查找也称折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。

2. 原理

  1. 查找的目标数据元素必须是有序的。没有顺序的数据,二分法就失去意义。
  2. 数据元素通常是数值型,可以比较大小。
  3. 目标元素和查找范围的中间值做比较(如果目标元素=中间值,查找结束),将目标元素分到较大/或者较小的一组。
  4. 通过分组,可以将查找范围缩小一半
  5. 重复第三步,直到目标元素=新的范围的中间值,查找结束。

3. 例子

(本文以升序为例进行讲解,降序方法类似)

3.1 当数组长度为奇数

假设有一组数据{1,2,3,4,5,6,7}
在这里插入图片描述
是奇数的情况很简单,指向中间的数字也很容易理解

如果要查找的数字是6,因为6大于中间的数字(4),所以舍去左边的数据。
在这里插入图片描述

3.1 当数组长度为偶数

在这里插入图片描述
当取中间元素,遇到两边数据个数不同时,并不影响我们查找元素,只需要规定是向上或向下取整。

所以数组长度是偶数还是奇数这个并不重要,也不影响怎么排除的问题,无非是多排除一个数字或者少排除一个数字。

3.3 实现过程

在 {1,2,3,4,5,6,7,8,9,10} 中查找元素9。

第一步要找到中间元素,设置两个变量low、high,分别指向数组第一个元素下标和最后一个元素下标,从而控制数组的范围,再根据low和high确定中间元素的下标mid
在这里插入图片描述
根据mid锁定的元素,和查找的元素(9)比较,确定新的查找范围、low 和high

在这里插入图片描述
在这里插入图片描述
此时,mid=8,arr[mid]=9,与要查找的元素相同,即已经找到了,并返回其下标。

如果数组中没有要查找的元素,会出现什么情况呢?

假设我们上面要查找的元素是:11

在这里插入图片描述
此时low=high=mid=9,arr[mid]=10不等于11,查找了整个数组都没有找到。

根据上述过程编写代码:

定义所需变量:

	int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个初始数组int n;//被查找的数printf("请输入你要查找的数:");scanf("%d", &n);//输入int len = sizeof(arr)/sizeof(arr[0]);//计算数组长度int low = 0;int high=len-1;//数组最后一个元素的下标int mid=(low+high)/2;//中间元素的下标

查找过程中,low一直在high的左边,即low<high,当low=high时还没有找到,就说明该数组中没有要查找的数。

我们用while循环语句控制查找过程
while语句的用法

	while (low <= high)//循环结束条件{//确定数组范围mid = (low + high) / 2;if (arr[mid] == n){printf("找到了,下标是:%d\n", mid);break;}else if (arr[mid] > n){high = mid -1;}else {low = mid + 1;}}

完整代码:

#include<stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int n;printf("请输入你要查找的数:");scanf("%d", &n);int len = sizeof(arr)/sizeof(arr[0]);int low = 0;int high=len-1;int mid=(low+high)/2;while (low <= high){mid = (low + high) / 2;if (arr[mid] == n){printf("找到了,下标是:%d\n", mid);break;}else if (arr[mid] > n){high = mid -1;}else {low = mid + 1;}}if (low > high)printf("没找到");return 0;
}

降序排列的数组进行二分查找时,只需改变判断条件:

else if (arr[mid] < n){high = mid - 1;}

4. 顺序查找与二分查找的区别

对数组{1,2,3,4,5,6,7,8,9,10}进行顺序查找:

//在一个有序数组中查找具体的某个数字n
#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//升序int n;scanf("%d", &n);int i;for (i = 0; i < 10; i++){if (arr[i] == n){printf("找到了,下标是:%d\n", i);break;}}if (i == 10){printf("没找到\n");}return 0;
}

虽然顺序查找法在书写上比二分法查找要简洁,但二分法比顺序查找速度更快

两者在查找前,必须知道将要查找的“值”

查找目的都是该“值”在列表中所在的位置(下标)

注:数据量越大,越能体现出二分法的快速性;相反数据量小的话,两者都可以使用


结束语

掌握了二分法的思想,代码实现就变得简单了。从hello world,到这里,你只要肯付出,就会有回报,加油!
  早起的鸟儿有虫吃。
  我们下一篇文章再见。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7395.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ss客服让您在Facebook 的客户服务更便捷

ss客服让您在Facebook Messenger 的客户服务更便捷 在这个信息时代&#xff0c;新兴通讯软件蓬勃兴起&#xff0c;比如Facebook Messenger。事实证明&#xff0c;这对企业来说非常有利&#xff0c;同时突出了电子邮件、网络聊天和电话等传统渠道的局限性。在传统渠道上&#xf…

驾驶舱数据指标体系设计指南

大数据时代下&#xff0c;各行各业面对众多的顾客和复杂多变的市场需求&#xff0c;要想及时适应市场变化&#xff0c;掌握市场动态&#xff0c;就需要对各个环节的数据进行分析&#xff0c;得到科学有效的结论来指导决策&#xff0c;这就离不开领导驾驶舱。 一、领导驾驶舱是什…

【电路原理学习笔记】第2章:电压、电流和电阻:2.1 原子结构

第2章&#xff1a;电压、电流和电阻 2.1 原子结构 元素&#xff1a;不能用化学方法分解成更简单形式的物质称为元素。原子&#xff1a;原子是体现元素特性的最小粒子。原子核&#xff1a;原子核由质子和中子组成&#xff0c;质子带有正电荷&#xff0c;中子呈中性。电子带有负…

PHP 文心千帆API接口对接

一&#xff1a;API 调用流程简介 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后&#xff0c;获取AppID、API Key、Secret Key 等信息。API 授权。对应用的 AppID 进行授权。获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key &#xff0c…

《PyTorch深度学习实践》第五讲 用PyTorch实现线性回归

b站刘二大人《PyTorch深度学习实践》课程第五讲用PyTorch实现线性回归笔记与代码&#xff1a;https://www.bilibili.com/video/BV1Y7411d7Ys?p5&vd_sourceb17f113d28933824d753a0915d5e3a90 PyTorch官网教程&#xff1a;https://pytorch.org/tutorials/beginner/pytorch_w…

数据中心动环监控系统分析与应用

摘要&#xff1a;介绍了数据中心动环监控系统&#xff0c;并结合原理图详细分析。本系统主要对数据中心的电源设备和环境参数 进行监控&#xff0c;如 UPS、蓄电池、配电柜、温湿度、漏水监测等&#xff0c;将实现多机房、微模块远程联网集中监管&#xff0c; 从而为提高数据中…

Linux服务器扩容VG时报错 Couldn‘t create temporary archive name

今天扩容磁盘遇到失败报错。 [rootmysql ~]# vgextend rhel /dev/sdc1 Couldnt create temporary archive name. 原因&#xff1a;磁盘使用100%&#xff0c;无法执行挂载&#xff0c;须预留部分空间出来。解决办法&#xff1a;删掉其中无用文件、log日志继续操作即可。释放空间…

React之hooks

Hooks函数 1.useState()&#xff1a;状态钩子。纯函数组件没有状态&#xff0c;用于为函数组件引入state状态, 并进行状态数据的读写操作。 const [state, setState] useState(initialValue); // state&#xff1a;初始的状态属性&#xff0c;指向状态当前值&#xff0c;类似…

6.26学习 es6中的类

学习 es6中的类 1.了解构造函数的属性2.类的继承2.1继承父类实例上的属性2.2继承父类原型上的属性或则方法&#xff08;公共属性或则方法&#xff09;2.2.1 Object.create2.2.2 Object.setPrototypeOf 3.es6中的类3.1定义3.2 继承 1.了解构造函数的属性 先上一份代码思考一下它…

数据结构-链表

链表结构 链表结构五花八门&#xff0c;今天我重点给你介绍三种最常见的链表结构&#xff0c;它们分别是&#xff1a;单链表、双向链表和循环链表。我们首先来看最简单、最常用的单链表。 单链表 我们习惯性地把第一个结点叫作头结点&#xff0c;把最后一个结点叫作尾结点。其…

Spring Boot 中的事务超时时间

Spring Boot 中的事务超时时间 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的话题。当我们在数据库中执行一些复杂的操作时&#xff0c;需要确保这些操作能够在一定的时间内完成&#xff0c;否则可能会导致数据一致性问题。为了解决这个问题&#xff0c;Spring Boot…

springboot 整合mybatis plus,使用druid 切换多数据源实现单数据库事务,附赠项目源码地址

项目源码地址 GitHub - liyanlei58/ssm: springboot druid mybatis plus 事务 最近想搭一套spring cloud开发环境&#xff0c;各种不顺利吧&#xff0c;先是spring cloud的组件某些功能不好用&#xff0c;是版本自身的bug。后来又碰到了事务无法回滚&#xff0c;这个搞了好几个…