C语言-二分查找

引言

在1个升序的数组中查找指定的数字n,很容易想到的办法就是遍历数组,但是这种方法效率较低。此时可以使用二分查找,二分查找适合有序或排序过的数组

目录

引言

什么是二分查找?

引言题目代码

为什么两个公式等价

二分查找有两个限制条件

二分查找的写法

左闭区--右闭区

左闭区--右开区


什么是二分查找?

二分查找(Binary Search),又称折半查找,是一种在有序数组中查找特定元素的高效算法。二分查找的过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则搜索过程将在数组的大于或小于中间元素的那一半区域中继续,以此类推,直到找到要查找的元素,或者剩下的半区域为空。


引言题目代码

#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int left = 0;int right = sizeof(arr) / sizeof(arr[0]) - 1;int key = 7; // 要找的数字int mid = 0; // 记录中间元素的下标int find = 0;while (left <= right) {//注意条件,有=号,否则无论答案对否都会跳出显示找不到mid = (left + right) / 2;if (arr[mid] > key) {right = mid - 1;} else if (arr[mid] < key) {left = mid + 1;} else {find = 1;break;}}if (1 == find) {printf("找到了,下标是%d\n", mid);} else {printf("找不到\n");}return 0;
}

求中间元素的下标, mid = (left+right)/2 ,如果left和right比较大的时候可能存在问 题,可以使用这个公式防止溢出:mid = left+(right-left)/2

这个公式等价是我在学习二分查找的时候最有疑问的一个点。现在我来讲一下

为什么两个公式等价

先假设我们有以下数组和要查找的键值:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int key = 7;

初始时,left 和 right 分别设置为数组的起始和结束索引:

int left = 0; // 数组的起始索引
int right = sizeof(arr) / sizeof(arr[0]) - 1; // 数组的结束索引

在第一次循环中,我们将计算 mid:
使用原始表达式:

mid = (left + right) / 2;
mid = (0 + 9) / 2;
mid = 9 / 2;
mid = 4;

使用修改后的表达式:

mid = left + (right - left) / 2;
mid = 0 + (9 - 0) / 2;
mid = 0 + 9 / 2;
mid = 0 + 4;
mid = 4;

现在,假设 left 和 right 的值非常大,接近 int 类型的最大值 INT_MAX。如果我们使用原始表达式,left + right 可能会导致溢出:

// 假设 left 和 right 非常接近 INT_MAX
left = INT_MAX - 100;
right = INT_MAX - 50;// 使用原始表达式
mid = (left + right) / 2;
// 如果不发生溢出,结果应该是 (INT_MAX - 100 + INT_MAX - 50) / 2
// 但实际上,left + right 会溢出,导致错误的结果

如果我们使用修改后的表达式,就不会发生溢出,因为 right - left 不会超过 int 类型的最大值:

// 使用修改后的表达式
mid = left + (right - left) / 2;
// 结果是 (INT_MAX - 100) + ((INT_MAX - 50) - (INT_MAX - 100)) / 2
// 这可以安全计算,不会溢出

二分查找有两个限制条件

  1. 查找的数量只能是一个,不能是多个
  2. 查找的对象在逻辑上必须是有序的

二分查找的写法

左闭区--右闭区

就是我上边引言的代码

左闭区--右开区
#include <stdio.h>int main() {// 示例数组,实际使用时可以从文件、命令行参数或用户输入获取int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int target = 4; // 需要查找的目标值int numsSize = sizeof(nums) / sizeof(nums[0]); // 计算数组大小// 初始化左边界和右边界int left = 0;int right = numsSize; // 注意:右边界是开区间,所以是数组大小// 二分查找循环while (left < right) { // 左闭右开,所以使用小于号int mid = left + (right - left) / 2; // 计算中间位置if (nums[mid] == target) {// 找到目标值,返回索引printf("目标值 %d 在数组中的索引为 %d。\n", target, mid);return 0; // 程序结束} else if (nums[mid] < target) {// 目标值在右区间,调整左边界left = mid + 1;} else {// 目标值在左区间,调整右边界right = mid;}}// 未找到目标值printf("目标值 %d 未在数组中找到。\n", target);return 0;
}

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

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

相关文章

用easyx做的消除字母游戏《字母消除大师》,快来看看吧

《字母消除大师》游戏介绍 游戏简介: 《字母消除大师》是一款简单而富有挑战性的休闲游戏。游戏中,玩家需要快速准确地按下屏幕上随机出现的英文字母,以消除它们。随着游戏的进行,字母下落的速度会逐渐加快,考验玩家的反应速度和手眼协调能力。 游戏特色: 简洁直观的…

HTML5+CSS3+移动web——HTML 基础

目录 一、标签语法 HTML的基本框架 1. 标题标签 2. 段落标签 3. 换行和水平线 4. 文本格式化标签 5. 图像标签 6. 路径 相对路径 绝对路径 7. 超链接标签 8. 音频 9. 视频 10. 注释 二、标签结构 一、标签语法 HTML 超文本标记语言——HyperText Markup Langua…

powershell 接收一个端口udp数据复制转发到多个目的

在 PowerShell 中&#xff0c;复制并转发 UDP 数据到多个目的地需要一些额外的处理&#xff0c;因为 UDP 是无连接的协议&#xff0c;没有像 TCP 那样的持久连接。因此&#xff0c;你不能像 TCP 那样简单地“接受”一个连接&#xff0c;而是需要监听 UDP 数据包&#xff0c;然后…

在Python中的闭包是什么

目录 1. 闭包的定义 2. 如何形成闭包 3. 闭包的工作原理 4. 使用场景 5. 注意事项 代码示例 总结 闭包&#xff08;Closure&#xff09;在Python中是一个非常有趣且强大的概念&#xff0c;它允许数据隐藏和封装&#xff0c;同时提高了代码的模块性和重用性。本文将从以下…

Kubernetes基础(十四)-k8s网络通信

1 k8s网络类型 2 Pod网络 2.1 同一pod内不同容器通信 Pod是Kubernetes中最小的可部署单元&#xff0c;它是一个或多个紧密关联的容器的组合&#xff0c;这些容器共享同一个网络命名空间和存储卷&#xff0c;因此Pod中的所有容器都共享相同的网络命名空间和IP地址——PodIP&a…

成员对象与封闭类

1. 成员对象与封闭类 类里有其他对象则该对象叫成员对象&#xff1b;有成员对象的类叫 封闭类&#xff1b;上例中&#xff0c;如果CCar类不定义构造函数&#xff0c;则会使用默认的无参构造函数&#xff0c;那么下面的语句会编译出错: 因为编译器不明白CCar类中的tyre成员对象…

C语言:函数

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; 一、函数的概念 数学中我们见过函数的概念&#xff0c;例如ykxb&#xff0c;k和b都是常数&#xff0c;给任意一个x就可以得到y 而C语言也引入了函数&#xff08;function&#xff09;这个概念&#xff0c;C语…

LeetCodeLCR 114. 火星词典——拓扑排序

文章目录 一、题目二、题解 一、题目 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还…

生成式学习,特别是生成对抗网络(GANs),存在哪些优点和缺点,在使用时需要注意哪些注意事项?

生成对抗网络&#xff08;GANs&#xff09; 1. 生成对抗网络&#xff08;GANs&#xff09;的优点&#xff1a;2. 生成对抗网络&#xff08;GANs&#xff09;的缺点&#xff1a;3. 使用生成对抗网络&#xff08;GANs&#xff09;需要注意的问题 1. 生成对抗网络&#xff08;GANs…

forecast-mae调试代码报错记录2个:

微调命令python3 train.py data_root/path/to/data_root modelmodel_forecast gpus4 batch_size32 monitorval_minFDE pretrained_weights"/path/to/pretrain_ckpt"中的两个错误。 问题1&#xff1a; pretrained_weights不需要加单引号&#xff0c;单引号 去掉。 问…

python实现k路归并排序

从归并排序中可以衍生出来一个新的问题&#xff0c;关于k路归并排序&#xff0c;给定k个已经排好序的数组&#xff0c;每个数组含有n各元素&#xff0c;要求将这k个数组合并成一个排好序的大数组。在对两路排好序的数组进行归并时候&#xff0c;会用两个指针指向两个数组首元素…

镜舟科技客户成功团队负责人孟庆欢:湖仓一体将成为数据架构的新范式

大数据产业创新服务媒体 ——聚焦数据 改变商业 随着数字化的概念逐步深入不同领域企业的运营中&#xff0c;业务形态和数字化路径也越来越丰富。这也为企业数据处理、储存的方式提出了更多要求。对于企业&#xff0c;尤其是数据驱动型企业来说&#xff0c;需要强大的解决方案…

RobotFramework写测试用例时的小技巧,代码自动生成+data自动获取

1、如何快速的定位对应的取值的值 在这里插入图片描述 2、快速对request的代码进行编写

1572.矩阵对角线元素的和(Java)

题目描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 输入&#xff1a; mat [[1,2,3], [4,5,6], [7,8,9]] 输出&#xff1a; 25 解释&#xff1a;对角线的和为&…

SpringBoot多模块项目proguard混淆

SpringBoot多模块项目proguard混淆 前言整活项目目录混淆后的效果图混淆配置混淆配置规则keep相关通配符和关键字keep说明常见问题解决办法效果前言 proguard 是压缩、优化和混淆Java字节码文件的免费的工具。 它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大…

单片机学习笔记---串口通信(2)

目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出&#xff1a; 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出&#xff1a; 方式2和…

Go 语言 for 的用法

For statements 本文简单翻译了 Go 语言中 for 的三种用法&#xff0c;可快速学习 Go 语言 for 的使用方法&#xff0c;希望本文能为你解开一些关于 for 的疑惑。详细内容可见文档 For statements。 For statements with single condition 在最简单的形式中&#xff0c;只要…

算法提升——LeetCode123场双周赛总结

周赛题目 三角形类型 II 给你一个下标从0开始长度为3的整数数组nums&#xff0c;需要用它们来构造三角形。 如果一个三角形的所有边长度相等&#xff0c;那么这个三角形称为equilateral。 如果一个三角形恰好有两条边长度相等&#xff0c;那么这个三角形称为isosceles。 如…

2 月 6 日算法练习- 动态规划

砝码承重 【问题描述】 你有一架天平和 N 个砝码&#xff0c;这 N 个砝码重量依次是 W1,W2,...,WN。请你计算一共可以称出多少种不同的正整数重量&#xff1f;注意砝码可以放在天平两边。【输入格式】 输入的第一行包含一个整数 N。第二行包含 N 个整数&#xff1a;W1,W2,W3,.…

【考研408】计算机与组成原理笔记

文章目录 [toc] 计算机系统概述计算机系统层次结构计算机硬件的基本组成计算机软件的分类计算机的工作过程计算机系统的多级层次结构课后习题 计算机的性能指标计算机的主要性能指标几个专业术语课后习题 总结 数据的表示和运算数制与编码进位计数制及其相互转换 定点数的表示与…