二分查找--图文详解

news2024/11/22 22:31:33

二分查找

  • 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.coloradmin.cn/o/715027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:重新配置PyCharm,让你的Python编程更加高效

重新配置PyCharm&#xff0c;让你的Python编程更加高效 PyCharm是一个流行的Python集成开发环境&#xff0c;被广泛用于Python编程。但是&#xff0c;有时候我们需要重新配置PyCharm以适应特定的工作需求或优化其性能&#xff0c;这篇文章将讨论如何重新配置PyCharm&#xff0…

K8S安全管理

1 安全管理 1.1 安全框架 1.1.1 认证框架 学习目标 这一节&#xff0c;我们从 基础知识、认证流程、小结 三个方面来学习。 基础知识 资源操作 用户访问k8s业务应用的流程&#xff1a;方法一&#xff1a;无需api_server认证用户 -- ingress|service -- pod方法二&#xf…

Transformer面试题总结

1.框架 Transformer和seq2seq一样由解码器和编码器组成&#xff0c;用多头注意力替换编码器和解码器架构中最常用的循环层 1.1 编码器&#xff1a;编码器有一堆N6的相同层组成&#xff0c;每一层有两个子层&#xff0c;第一个子层包含多头注意力机制&#xff0c;第二个子层是前…

Spring MVC相关注解运用 —— 中篇

目录 一、RESTful风格支持 1.1 RESTful风格介绍 1.2 postman使用 二、PathVariable 2.1 实例程序 2.2 测试结果 三、PostMapping、GetMapping、PutMapping、DeleteMapping 四、HiddenHttpMethodFilter 4.1 在web.xml配置过滤器 4.2 控制器方法 4.3 JSP页面 4.4 测…

数据库管理工具DBeaver 连接 TDengine详细教程

数据库管理工具DBeaver 连接 TDengine 一、介绍二、前置条件2.1 TDEngine安装 2.2 DBeaver 下载及安装三、DBeaver 连接 TDengine 一、介绍 Dbeaver是一款功能强大的数据库管理工具&#xff0c;支持任何拥有 JDBC-Driver 的数据库。TDengine是一款由涛思数据开发的国产的时序数…

【网络编程】网络编程套接字(二)简单的UDP网络程序

文章目录 服务器编程1.创建服务端套接字2.绑定服务端套接字3.服务端启动 客户端编程1.创建客户端套接字2.绑定客户端套接字 服务器和客户端测试 服务器编程 1.创建服务端套接字 使用socket函数调用可以创建套接字的文件描述符&#xff0c;与前边的文件类似&#xff0c;socket…

【基础算法】递归算法

递归算法是一种直接或间接调用原算法的算法&#xff0c;一个使用函数自身给出定义的函数被称为递归函数。利用递归算法可以将规模庞大的问题拆分成规模较小的问题&#xff0c;从而使问题简化。无论是递归算法还是递归函数&#xff0c;最大的特点都是“自己调用自己”。 斐波那…

nRF52832蓝牙概述

基本概念 RSSI&#xff08;Received Signal Strength Indicator&#xff09;是接收信号的强度指示。 接收包RSSI是指无线模块发送信息后&#xff0c;接收端的无线模块接收到数据后&#xff0c;当前接收数据的信号强度的寄存器值&#xff0c;也就是接收模块获取到发送模块当前发…

Vector - CAPL - 数据库和CAPL_01

目录 获取CAN总线报文信息 静态访问报文信息 动态访问报文信息 静态访问数据库信息 DBLookup&#xff08;Access Message & Signal&#xff09; 1、报文类型信息 2、类型信息 3、节点信息 获取CAN总线报文信息 我们在做CAN网络管理或者通信的测试的过程中&#xf…

LLM prompt提示构造案例

参考&#xff1a; https://github.com/PlexPt/awesome-chatgpt-prompts-zh 吴恩达 prompt工程应用&#xff1a; https://www.bilibili.com/video/BV1No4y1t7Zn prompt构造案例代码 prompt """文本分类任务&#xff1a;将一段用户给外卖服务的评论进行分类…

LSTM已死,Transformer永生(面试问答RNN/LSTM/Transformer)

计算机视觉面试题-Transformer相关问题总结&#xff1a;https://zhuanlan.zhihu.com/p/554814230 计算机视觉面试31题 CV面试考点&#xff0c;精准详尽解析&#xff1a;https://zhuanlan.zhihu.com/p/257883797 1. 循环神经网络&#xff08;Recurrent Neural Networks, RNN&am…

渲染颜色透明度异常分析 Unity RenderTexture

解决 Unity Canvas 相机 RenderTarget 渲染颜色透明度异常的问题 问题 重现场景 新建一个 Canvas-RT , Canvas Render Mode 改为 Screen Space - Camera 。 为 Canvas-RT 添加一个 RawImage-Origin 对象&#xff0c;修改颜色透明度为 120 。 修改 Camera-RT 中的 Target Textur…

如何实现Nginx+Tomcat反向代理与负载均衡

目录 一、正向代理与反向代理 正向代理 反向代理 二、负载均衡 什么是负载均衡 代码仓库定义 分流策略 权重 least_conn&#xff08;最少连接&#xff09; ip_hash&#xff08;负载均衡模式&#xff09; fair&#xff08;第三方负载均衡模式&#xff09; url_hash&…

算法设计与分析 课程期末复习简记

目录 网络流 线性规划 回溯算法 分支限界 贪心算法 动态规划 分治算法 算法复杂度分析 相关概念 网络流 下面是本章需要掌握的知识 • 流量⽹络的相关概念 • 最⼤流的概念 • 最⼩割集合的概念 • Dinic有效算法的步骤 • 会⼿推⼀个流量⽹络的最⼤流 下面对此依次进行复…

基于AUTOSAR的ECU启动阶段哪些事儿

AUTOSAR实战篇:EcuM启动时序大总结 前言 小T出品,必是精品! EcuM启动时序大总结,你值得拥有! 正文 正如小T前文中《AUTOSAR基础篇之EcuM》中讲到的那样,AUTOSAR架构中将ECU的上下电过程统一由单一的模块来进行统一管理,即EcuM模块。 虽然不同硬件的初始化过程不一样,但…

Redis是什么

Redis是什么 https://blog.csdn.net/Little_Oranges/article/details/121870705 1.简介 基于字典格式的。基于内存&#xff0c;高性能的。键值对的方式进行存储。可以存储多种数据结构类型的数据。 2.应用场景 缓存排行榜计数器分布式会话分布式锁社交网络最新列表消息系统 …

华为OD机试真题 JavaScript 实现【查找充电设备组合】【2023Q1 100分】

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、JavaScript算法源码六、效果展示1、输入2、输出3、说明一、题目描述 某个充电站,可提供n个充电设备,每个充电设备均有对应的输出功率。任意个充电设备组合的输出功率总和,均构成功率集合P的1个元素。功率集合P的…

Qt Quick系列(8)—Model-View—视图信号

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言代码示例源码关键知识点 总结 前言 在Qt Quick的Model-View中内置视图有很多&#xff0c;有Repeater、ListView、GridView…&#xff0c;而他们也有着自己的信号&#xff0c;比如…

WebDAV之派盘本地个人云+Documents

Documents是一款由Readdle开发的文档管理和编辑工具&#xff0c;支持PDF阅读、音频播放、图像浏览和标注、以及多种常见文档格式的编辑操作等。派盘是一款本地私有云产品&#xff0c;基于WebDAV、FTP、SMB等多种协议&#xff0c;提供文件存储、分享、同步、备份等服务&#xff…

【Squid一】Squid代理服务器应用

Squid代理服务器应用 1.Squid代理服务器1.1 正向代理的工作机制1.2 代理服务器的概念及其作用1.3 代理服务器主要作用1.4 Squid代理的类型 2.CDN2.1 CDN概述2.2 CDN优势2.3 CDN对网络的优化作用2.4 CDN访问过程2.5 CDN网络的组成要素 3.安装Squid服务3.1 使用脚本启动和关闭squ…