数组算法--二分查找

news2024/11/10 17:01:32

目录

一.前言

二.算法的核心思路

三.算法的核心代码以注释详解


一.前言

        二分查找也叫折中查找,为什么会这样叫呢?就是因为我们二分查找的核心逻辑就是每查找完一次,都能将查找的范围给缩小一半,也就是折中。但使用二分查找又有个很大的前提,那就是该数组里的元素得是有序排序的,也就是从小到大排序或者从大到小排序。

二.算法的核心思路

        首先我们以一个从小到大进行排序的数组{3,4,5,6,7,8}为例,二分算法之所以能够每次将范围缩小一半就是因为它设置了中间值,我们把它命名为mid。

        接着我们明确下我们要查找的范围,也就是设置一个最左边的值,设为min,它的值会是索引号0。设置一个最右边的值为max,它的值就会是数组长度减一。而我们的mid值就是对这两者进行求和再除以2的结果。

        在这个例子中,我们的min=0,max=6-1=5,mid=(0+5)/2=2。它们值也就是索引值。

        接着我们只需要拿数组中索引值为mid的数据来和我们要查找的数据进行大小对比即可。要是数据大于mid的数据,且我们这里是按照从小到大进行排序的,所以我们就能确定我们要查找的数据在我们的mid和max中间。

        这个时候我们就可以缩小范围,让min等于mid的值加一,max保持不变,mid还是min和max两者求和后的一半。

        同理,要是小于mid的数据,就让min保持不变,max的值等于mid减一。达到一个每查找一次就能将范围缩小一半的效果,同时,因为mid已经和要查找的数据进行对比过了,所以我们每次更改min和max的值时候,就需要加一或者减一。

三.算法的核心代码以注释详解

#include<stdio.h>
int binaryFind(int arr[], int len, int num);

int main() {
	//给定一个有序的数组和要查找的数,对它进行二分查找。
	int arr[] = {11,22,33,44,55,66,77};
	int len = sizeof(arr) / sizeof(int);

	//定义一个num变量用来存放要查找的数据
	int num = 66;

	//定义一个变量来接收函数传递过来的索引
	int index = binaryFind(arr, len, num);
	printf("%d\n", index);
	return 0;
}

int binaryFind(int arr[], int len,int num) {	//别忘了声明函数
	//设置min和max的初始值
	int min = 0;
	int max = len - 1;

	//我们查找结束的条件就是当min>max的时候,这表示查完数组中所有的元素都没有满足的。
	while (min <= max) {
		
		//每次比较完更新mid的值
		int mid = (min + max) / 2;
		//判断完之后来决定范围的更新。
		if (arr[mid] < num) {   //表示要查找的数据在mid的右边,如果是从大到小排序的,则是在左边。
			min = mid + 1;
		}
		else if (arr[mid] > num) {	//在mid的左边,更新max的值来缩小范围。
			max = mid - 1;
		}

		//这种情况是刚好mid索引处的值等于要查找的数据
		else {
			return mid;
		}
	}
	return -1;
}

下面我们来看下运行的结果:

 

这里的5表示我们要查找的数据在数组中的索引值为5的地方。 

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

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

相关文章

宏VB的1004问题,方法作用于对象错误,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令

在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…

windows 下删除一个文件夹及其子文件夹下相同后缀名的文件

问题 我有一个工作目录&#xff0c;沉积了四五年的工作 文件。其中有一个相同格式的中间过程文件暂用很大体积&#xff0c;也不需要保留&#xff0c;并且可以通过其他文件生成。因此想一次删除这个工作目录下的所有相同后缀的文件。 解决方法 在工作目录的地址栏输入“cmd”…

leaflet【九】使用天地图改变地图底色

本文将详细探讨如何在Leaflet地图框架中集成天地图&#xff0c;并介绍如何通过调整背景色和滤镜来改变地图的显示效果。首先&#xff0c;我们将解释如何在Leaflet中配置天地图作为底图&#xff0c;包括API密钥的获取与使用。接下来&#xff0c;文章将展示如何通过CSS和JavaScri…

高等数学 第六讲 一元微分学的应用(二)_中值定理,微分等式,微分不等式

高等数学 第6讲 中值定理 微分等式 微分不等式 文章目录 高等数学 第6讲 中值定理 微分等式 微分不等式1.涉及函数的中值定理1.1 有界与最值定理1.2 介值定理1.3 平均值定理1.4 零点定理 2.涉及导数(微分)的中值定理2.1 导数零点定理2.2 罗尔定理2.3 拉格朗日中值定理2.4 柯西中…

如何利用Jenkins自动化管理、部署数百个应用

目录 1. Jenkins 安装与部署步骤 1.1 系统要求 1.2 安装步骤 1.2.1 Windows 系统 1.2.2 CentOS 系统 1.3 初次配置 2. Gradle 详细配置方式 2.1 安装 Gradle 2.1.1 Windows 系统 2.1.2 CentOS 系统 2.2 配置 Jenkins 中的 Gradle 3. JDK 详细配置方式 3.1 安装 JD…

【MSP430】DriverLib库函数,UCS函数分析

MSP430F5xx_6xx_DriverLib_Users_Guide-2_91_13_01(函数库手册).pdf 在MSP430单片机中&#xff0c;UCS&#xff08;User Clock System&#xff09;模块提供了一组函数用于配置和管理时钟源&#xff0c;包括外部和内部振荡器以及时钟信号的路由和控制。这些函数对于确保系统在正…

layui改造优化ITtools技术笔记01—layui.js重要修正

问题现象&#xff1a; ittools教学平台自动生成的单选按钮渲染后无法切换选项。 故障排查&#xff1a; input[name xxx]&#xff0c;其中xxx含有特殊字符&#xff0c;如$等&#xff0c;导致layui渲染时&#xff0c;表达式出错&#xff0c;无法及时渲染。 解决方案&#xff1…

IO流综合练习

IO流综合练习 文章目录 IO流综合练习制造假数据需求利用糊涂包制造假数据&#xff0c;并写入文件中 随机点名器Student标准JavaBean类实现代码names.txt文件中的内容 登录 制造假数据 需求 制造假数据也是开发中的一个能力&#xff0c;在各个网上爬取数据&#xff0c;是其中一…

js动画插件-vue

分享一个动画插件 学习 动画插件 是进入大厂的必备技能 首先我们需要先学会 去使用js 动画 封装好的 GreenSock 动画平台 &#xff08;GSAP&#xff09; greensock.com/gsap/ 就是这个插件 我现在分享一个用例 其实很简单 但是 具体的属性 和很多 内容需要慢慢使用 慢慢看…

java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象

有面试题&#xff0c;有synchronized锁&#xff0c;threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作&#xff0c;手动释放锁&#xff0c;显式地获取锁&#xff08;属…

震惊,刷新我的认知,医疗信息数据库sqlserver中计算年龄的sql函数写了200行...

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” sqlserver中年龄计算,HIS系统中年龄计算函数 呈现的结果要求: 1周岁内显示"几月几天",1周岁以上显示"几岁" CREATE FUNCTION dbo.FUN_GETBRNL( birth varchar(…

汇昌联信拼多多电商有哪些热门话题?

随着互联网技术的飞速发展&#xff0c;电子商务已经成为人们日常生活的一部分。作为中国领先的电商平台之一&#xff0c;拼多多凭借其独特的商业模式和营销策略迅速崛起&#xff0c;吸引了大量消费者的关注。那么&#xff0c;在汇昌联信拼多多电商领域&#xff0c;有哪些热门话…

SpringBoot启动原理详解(二)

透彻理解SpringBoot启动原理&#xff08;二&#xff09; 照旧一张Spring启动顺序图我们对Spring启动原理有多少理解呢&#xff08;问题回顾&#xff09;关于Spring启动原理的若干问题1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。2.Spring 何时装配A…

【C语言】数组栈的实现

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题&#xff0c;在这个领域中&#xff0c;使用图神经网络&#xff08;GNNs&#xff09;似乎是一个自然的选择。然而&#xff0c;以往关于使用GNNs进行推理的工作表明&#xff0c;当这些模型面对需要比训练时更长推理链的测…

听见未来,AI+Audio|2025中国国际音频产业大会(GAS)

随着AI技术的创新与突破&#xff0c; 音频行业正步入前所未有的黄金发展期。 2025中国国际音频产业大会&#xff0c; “AI对行业发展的影响” 将成为讨论的热点之一。 3月26-27日&#xff0c;2025中国国际音频产业大会&#xff08;GAS&#xff09;将在上海 张江科学会堂召…

Conda和Pip有什么区别?

conda和pip是Python中两种常用的包管理工具&#xff0c;它们在用途、包来源以及环境管理等方面存在区别。以下是具体分析&#xff1a; 用途 conda&#xff1a;conda是Anaconda发行版中的包管理工具&#xff0c;可以管理包括非Python软件包在内的各种包。它是一个全面的环境管理…

【iOS】GCD

参考文章&#xff1a;GCD函数和队列原理探索 之前写项目的时候&#xff0c;进行耗时的网络请求使用GCD处理过异步请求&#xff0c;但对一些概念都很模糊&#xff0c;这次就来系统学习一下GCD相关 相关概念 什么是GCD&#xff1f; Grand Center Dispatch简称GCD&#xff0c;是…

python-docx 如何将列表中的值提取到段落中的run以及保存为多个文档?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…