详解【C语言】中的二分查找法和折半查找法(例题解答)

article/2025/8/24 0:37:30

目录

    • 问题
    • 思路
    • 详解
    • 代码

问题

在一个有序数组中查找具体的某个数字n

比如我买了一双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?

答案:你每次猜中间数

思路

我们先定义一组有序数组,假设为:int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

因为我们知道数组的下标是从0开始的,假设我要找数字7的下标

来看一张图:
在这里插入图片描述
数字1的下标是0,数字10的下标是9

我们先求中间元素:(0+9) / 2 = 4 (注意:这里的\是不取余的),那么得到了下标为4的数字5

而数字5要比我们找的7小,说明我们在数字5的左边是找不到的。

所以我们查找的范围缩小为是:数字6~10,是不是我们的范围缩小了一半?

那么这个新的范围我们是怎么查找的呢?

其实很简单,如图,这是新的范围,右下标还是9,而左下标就变成了:4+1=5

在这里插入图片描述
左下标5对应的就是数字6,右下标9对应的是数字10

我还是先求中间元素:(5+9) / 2 = 7,那么7作为下标的话,对应的数字就是8
在这里插入图片描述
数字8比我要找的数字7大,说明我们要找的下标在数字8的左边

所以我们被查找的范围缩小为:数字6~7,那么我的查找范围是不是又相当于缩小了一半?

那么我们就可以得到了一个新的范围:如图,左下标还是5,而右下标就变成了:7-1=6
在这里插入图片描述
此时左下标5对应的是数字6,右下标6对应的数字7,那么中间元素为:(5+6) / 2 = 5

这里我们得到了中间元素为5,进而锁定的数字就是6

数字6比我要找的数字7小,说明我要找的元素在数字6的右边,而在数字6的右边,查找的范围只剩一个数字7了

那么数字7的左下标就为6右下标还是为6

那么我现在还是通过下标的计算方法:(6+6) / 2 = 6,那么6锁定的元素就是我们的数字7
在这里插入图片描述
数字7和我们要找的7对比了一下,相等!那么说明已经找到了

这就是二分查找的过程!

详解

我刚刚查找的过程中,你会发现,我每次都在找{ 1,2,3,4,5,6,7,8,9,10 }的中间元素

中间元素比我要找的元素小,说明我要找到元素在中间元素的右边,那么范围就缩小了一半

这种思路,每一次范围都在缩小一半,查一次缩小一半

这种算法就叫做:折半查找或者二分查找

代码

在下面的代码中

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//计算数组元素的方法:int sz = sizeof(arr) / sizeof(arr[0]);//sizeof(arr)计算的是数组的总大小,单位是字节,这组数组是10个元素,每个元素是int类型//所以总大小为40//sizeof(arr[0])就是计算第一个元素的大小,第一个元素的大小为1个int,也就是4个字节//40 / 4 = 10int k = 7; //我们要查找的数字int left = 0;//定义左下标int right =  sz - 1; //(元素 - 1)就为右下标while (left <= right){int mid = (left + right) / 2; //mid定义中间元素if (arr[mid] < k){left = mid + 1;} else if (arr[mid] > k){right = mid - 1;}else{printf("找到了,下标是:%d\n", mid);break; //找到了就停下来}    }//当左下标>右下标时,是找不到的if (left > right){printf("找不到\n");}return 0;
}

代码执行的结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/reC7MYZ1.shtml

相关文章

数据结构之折半查找法——C语言实现

概念&#xff1a; 折半查找法又称为二分查找法&#xff0c;该方法要求带查找的表是顺序存储结构并且表中的关键字大小有序排列。 查找过程&#xff1a; 先确定待查记录所在的区间&#xff0c;然后逐渐通过待查找值与区间中间值进行比较进而调整区间大小&#xff0c;不断缩小…

C语言中折半查找法(二分法)的实现

折半查找法也叫做二分查找&#xff0c;顾名思义&#xff0c;就是把数据分成两半&#xff0c;再判断所查找的key在哪一半中&#xff0c;再重复上述步骤知道找到目标key; 注意&#xff1a;&#xff08;咳咳&#xff0c;敲黑板&#xff09;折半查找法仅适用于对已有顺序的数组、数…

C语言——折半查找法

一、使用场景 假如现在有一组数据&#xff0c;你想要查询这个具体某一个数据在这一堆数据中的所在位置&#xff0c;这个时候就需要程序在这一组数据中&#xff0c;找到与想要查找的目标数据相匹配的那个数据&#xff0c;然后返回相对应的位置。如果将问题再细化简化一点&#…

利用Xpath进行动态定位元素

xpath中提供了三个非常好的方法来为我们定位部分属性值&#xff1a; 1、contains(a, b) 如果a中含有字符串b&#xff0c;则返回true&#xff0c;否则返回false 2、starts-with(a, b) 如果a是以字符串b开头&#xff0c;返回true&#xff0c;否则返回false 3、ends-with(a, b) 如…

WebDriver操作浏览器以及浏览器页面元素的方法

上篇文章是讲了WebDriver定位元素的方法&#xff0c;这篇文章就要讲操作了&#xff0c;本文内容篇幅可能会比较长&#xff0c;一个是因为要操作的项目比较多&#xff0c;另一个是我会将完整的代码放进来&#xff0c;总体原则上我还是追求尽量细致一些&#xff0c;以便能方便读者…

UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码——使用动态IP

目录 Virtual Private Network 代理服务器 测试代理IP是否生效 上一篇博文UN Comtrade&#xff08;联合国商品贸易统计数据库&#xff09;数据爬取Python代码讲了如何使用Python爬取UN comtrade数据&#xff0c;适用于少量数据爬取&#xff0c;由于网站对访问频率和访问量的…

uni-app点击按钮,生成列表元素

在jQuery里面&#xff0c;动态生成div元素需要进行html的拼接&#xff0c;拼接完成再将拼接的内容放到指定的div里面去&#xff0c;在vue中一般编写代码时都不需要操作DOM元素&#xff0c;那么点击按钮的时候&#xff0c;怎么动态生成自己想要的列表元素&#xff1f; 其实很简…

DOM(二)修改元素内容、属性

一个元素可以修改它的内容、属性和样式。 目录 DOM修改元素 1. 修改内容 2. 修改属性 DOM修改元素 1. 修改内容 &#xff08;1&#xff09;获取从修改元素开始标签到结束标签之间的原始的 HTML 内容 元素对象.innerHTML innerHTML 获取元素内容时&#xff0c;原样返回 H…

UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码

目录 Python代码 根据需求改写url 报错应对办法 UN Comtrade数据库关于中国台湾的数据 2021/9/28更新&#xff1a;最近有用户反馈下载会出现错误内容如下图&#xff0c;感谢用户三眼皮138帮忙找出错误。官方应该是更新API的使用了&#xff0c;在爬取数据是将url中的关键词m…

uni-app中动态修改伪类元素的样式

1.首先定义一个变量 2.在伪元素的父元素上面动态添加style&#xff0c;注意这个 设置的变量 --state 因为下面是 var 调用的所以需要加两个杠. 3.使用var调用变量 --state

selenium的常见表单元素操作

selenium的表单相关操作 selenium是浏览器自动化测试框架&#xff0c;是一个用于Web应用程序测试的工具&#xff0c;可以直接运行在浏览器当中&#xff0c;并可以驱动浏览器执行指定的动作&#xff0c;如点击、下拉、填充数据、删除cookie等操作&#xff0c;还可以获取浏览器当…

Web API:ResizeObserver——监听元素大小的变化

前言 最近突然发现了ResizeObserver 感觉挺有用的就简单学习了一下。 众所周知window.resize事件能帮我们监听窗口大小的变化。但是reize事件会在一秒内触发将近60次&#xff0c;所以很容易在改变窗口大小时导致性能问题。换句话说&#xff0c;window.resize事件通常是浪费的…

法规标准-UN R157标准解读

文章目录 UN R157是做什么的&#xff1f;ALKS系统一般要求动态驾驶任务本车道内行驶允许越过车道线执行LCP变道程序在EM期间进行回避车道交叉为应急车辆和执法车辆形成通道部分进入相邻车道&#xff0c;以绕过部分阻塞车道的障碍物 激活系统控制车速跟车停止前车减速、切入、切…

图像分割UNet系列------Res-UNet详解

图像分割unet系列------Res-UNet详解 1、Res-UNet要解决的问题2、Res-UNet主要网络结构3、引发的思考 Res-UNet发表于2018年&#xff0c;是UNet非常重要的改进版本之一。当然&#xff0c;Res-UNet同样是应用在医学图像分割领域-----视网膜血管分割。 1、Res-UNet要解决的问题 作…

U-Net

(1)使用全卷积神经网络。(全卷积神经网络就是卷积取代了全连接层&#xff0c;全连接层必须固定图像大小而卷积不用&#xff0c;所以这个策略使得&#xff0c;你可以输入任意尺寸的图片&#xff0c;而且输出也是图片&#xff0c;所以这是一个端到端的网络。 整个网络有23层卷积层…

Pytorch实战系列(一)——CNN之UNet代码解析

目录 1.UNet整体结构理解 1.1 UNet结构拆解 1.1.1 卷积层主体&#xff1a;两次卷积操作 1.1.2 左部分每一层&#xff1a;下采样卷积层 1.1.3 右部分每一层&#xff1a;上采样中部分跳跃连接卷积层 1.1.4 输入层和输出层 1.2 UNet结构融合 2.UNet Pytorch代码理解 2.1 …

快速理解Unet的网络结构

Unet 前言FCNUnet 前言 U-Net和FCN非常的相似&#xff0c;U-Net比FCN稍晚提出来&#xff0c;但都发表在2015年&#xff0c;和FCN相比&#xff0c;U-Net的第一个特点是完全对称&#xff0c;也就是左边和右边是很类似的&#xff0c;而FCN的decoder相对简单&#xff0c;只用了一个…

Unet网络解析

1 Unet网络概述 论文名称&#xff1a;U-Net: Convolutional Networks for Biomedical Image Segmentation 发表会议及时间 &#xff1a;MICCA ( 国际医学图像计算和 计算机辅 助干预会 议 ) 2 0 1 5 Unet提出的初衷是为了解决医学图像分割的问题。 Unet网络非常的简单&…

分割网络模型(FCN、Unet、Unet++、SegNet、RefineNet)

1、FCN https://blog.csdn.net/bestrivern/article/details/89523329《Fully Convolutional Networks for Semantic Segmentation》https://arxiv.org/abs/1411.4038 FCN是不含全连接层的全卷积网络&#xff0c;对图像进行像素级的分类&#xff0c;解决了图像的语义分割问题&a…