二分法(折半法)查找【有动图】

二分法,也叫做折半法,就是一种通过有序表的中间元素与目标元素进行对比,根据大小关系排除一半元素,然后继续在剩余的一半中进行查找,重复这个过程直至找到目标值或者确定目标值不存在。

我们从结论往回推,判断其条件为什么这么写。

先看代码:

void search(int[] A,int x){     int low=0,high=n-1,mid;     while(low<=high){     mid = (low+high)/2;     if(A[mid] == x)break;     else if(A[mid] < x) //目标元素在当前中间元素的右边  low = mid+1;    else//目标元素在当前中间元素的左边  high = mid-1;     }if(low > high)//未找到     return;     
}

难点无非在于两个问题:

  1. mid=(low+high)/2的问题。
  2. 为什么设定low<=high为符合条件,low>high为不符合条件?

首先说第一个问题,因为int类型在做除法运算时,如果结果不为整数,则会向下取舍,所以7/2=3,9/2=4。这个问题取决了本问题中的mid会指向哪个元素:

当顺序表元素个数为奇数时:
mid=(0+6)/2=3
在这里插入图片描述

当顺序表元素个数为偶数时:
mid= (0+7)/2=3
在这里插入图片描述

  • 当目标元素>mid时,low移动到mid右边;
  • 当目标元素<mid时low移动到mid左边;
  • 当目标元素==mid时退出循环。

根据以上步骤,假设查找元素为x,我们可以得到:

元素个数为奇数时

请添加图片描述

当元素个数为偶数时

请添加图片描述

边界情况(目标元素在表头或表尾)

请添加图片描述

可以发现,在边界情况下,当low==high时,mid也依旧再移动一次才能找到指定元素。所以循环条件必须要带上=。

找不到的情况

请添加图片描述

可以发现,在最后一次查找中,三个指针会指向同一个元素,而代码中比较完紧随其后的就是移动指针,图画中x>5,所以low会向右移动一个元素,此时两个箭头出现了交叉,确定了该有序表中没有目标元素。所以不符合的条件为low>high。

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

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

相关文章

PL/I语言的起源?Objective C语言起源哪里?JavaScript的起源?Java的起源?B语言的起源?C++语言的起源?C#的起源?

PL/I语言的起源 在20世纪50~60年代&#xff0c;当时主流的编程语言是COBOL/FORTRAN/ALGOL等&#xff0c;IBM想要设计一门通用的编程语言&#xff0c;已有的编程语言无法实现此要求&#xff0c;故想要设计一门新语言&#xff0c;即是PL/I. PL/I是Programming Language/One的缩写…

labview关于文件路径的问题

在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数&#xff0c;最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中&#xff0c;应用程序目录更像是根目录&#xff0c;往下拆分成了各个VI的子目录。 接下来我们来拆…

Vue + Websocket播放PCM(base64转ArrayBuffer、 字符串转ArrayBuffer)

文章目录 引言I 音视频处理相关概念和APIII 案例:基于开源库 pcm-player方式播放借助MediaSource和Audio对象播放音频流。基于原生api AudioContext 播放操作III 格式转换js字符串转ArrayBufferbase64 转 ArrayBufferIV 解决pcm-player分片播放问题引言 需求: 基于webscoket传…

钉钉授权登录

一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后&#xff0c;点击自己【新建的应用】&#xff0c;进入详细页面 四。进入应用详细页面。左边【分享设置】 注意&#xff1a;进…

kali中信息收集的一些常用工具

这里只是代表个人所见&#xff0c;所以肯定会有其他的没提到&#xff0c;希望大家体谅 前言 信息收集分为主动和被动的 主动就是通过自己的机器去和对方比如通信后获得的数据 被动是指不是在自己这里获取的&#xff0c;可以是第三方平台获取到的&#xff0c;与目标没有通信 …

Apple Vision Pro开发003-PolySpatial2.0新建项目

unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial&#xff08;单独导入&#xff09;&#xff0c;或者直接安装 三、对应设置 其他的操作与之前的版本相同…

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能&#xff0c;可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧&#xff01; 首先…

@EnableConfigurationProperties @ConfigurationProperties

EnableConfigurationProperties && ConfigurationProperties的使用时机 今天在写properties时想到了这个问题&#xff0c;为什么有时候我需要写EnableConfigurationProperties有时候又不需要呢&#xff1f;下面就详细讲讲。 Data Component ConfigurationProperties(pr…

【Unity踩坑】在Mac上安装Cocoapods失败

在集成Unity Ad时&#xff0c;如果是第一次在iOS上集成&#xff0c;会在Mac上安装Cocoapods。 安装时提示下面的错误&#xff1a; Error installing cocoapods:The last version of drb (> 0) to support your Ruby & RubyGems was 2.0.5. Try installing it with gem…

HBU算法设计与分析 贪心算法

1.最优会场调度 #include <bits/stdc.h> using namespace std; const int N1e55; typedef pair<int,int> PII; PII p[N]; priority_queue<int,vector<int>,greater<int>> q; //最小堆 存储最早结束的会场的结束时间 int n; //其实这个题可以理…

FPGA学习-FFT变换-解决频率低信号进行FFT运算的取点问题

FPGA学习-FFT变换-解决频率低信号进行FFT运算的取点问题 前言一、FFT输入二、FFT配置波形分析 前言 首次接触FFT变换是在OFDM中&#xff0c;QAM后的实部信号与虚部信号需要进行FFT转化&#xff0c;将频域信号转化为时域信号&#xff0c;最终通过DA接口转化为模拟信号。当时对于…

(免费送源码)计算机毕业设计原创定制:Java+SSM+JSP+Ajax+MySQLSSM国外鞋服代购平台

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采用…

NCL笔记:[读取特殊符号变量]

ncl无法读取变量参数中含有特殊符号的&#xff0c;例如PM2.5. 如下操作&#xff1a; pm25_file "CHAP_PM2.5_D1K_20211208_V4.nc"b addfile(pm25_file, "r")v new(1,string)v (/"PM2.5"/)pm25 b->$v$就可以了

【Rust练习】23.生命周期

练习题来自https://practice-zh.course.rs/lifetime/basic.html 1 /* 为 i 和 borrow2 标注合适的生命周期范围 */// i 拥有最长的生命周期&#xff0c;因为它的作用域完整的包含了 borrow1 和 borrow2 。 // 而 borrow1 和 borrow2 的生命周期并无关联&#xff0c;因为它们的…

conda、pip同时安装包引起混乱问题剖析

一句话总结&#xff1a; 安装版本不一致时会有两个.dist-info文件夹&#xff08;举例&#xff1a;scapy-2.6.1.dist-info和scapy-2.4.3.dist-info&#xff09;&#xff0c;conda list和pip list依靠这两个文件夹进行包的识别&#xff08;疑似pip list识别老版本&#xff0c;co…

类和对象--中--运算符重载、日期类实现(重要)

1.运算符重载 2.1作用&#xff1a; 为了让C的新类型&#xff1a;类。也可以进行内置类型的运算符操作。所以就有了运算符重载。 2.2定义&#xff1a; 运算符重载是具有特殊名字的函数&#xff0c;他的名字是由operator和后⾯要定义的运算符共同构成。和其 他函数⼀样&#…

Linux基本指令【Linux系统】

文章目录 lspwdcdtouchmkdirrmdirrmmancpmvcatlessheadtailfindwhichwhereisaliasgrepzip和unzipunameexitshutdown ls 显示指定[指定方式 &#xff1a;ls空格路径]路径中非隐藏的文件 使用语法&#xff1a; ls [选项] [⽬录或⽂件] ls的常用选项 -a列出目录下的所有文件,包…

[开源]3K+ star!微软Office的平替工具,跨平台,超赞!

大家好&#xff0c;我是JavaCodexPro&#xff01; 数字化的当下&#xff0c;高效的办公工具是提升工作效率的关键&#xff0c;然而大家想到的一定是 Microsoft Office 办公软件&#xff0c;然而价格也是相当具有贵的性价比。 今天JavaCodexPro给大家分享一款超棒的开源办公套…

C++ 中的随机数生成全方面介绍

目录 引言 基本概念 什么是随机数&#xff1f; 伪随机数生成器&#xff08;PRNG&#xff09; 线性同余生成器&#xff08;LCG&#xff09; 梅尔森旋转算法&#xff08;Mersenne Twister&#xff09; 随机数的质量 随机数生成器的测试 C 中的随机数生成 传统方法&…

Django实现智能问答助手-数据库方式读取问题和答案

扩展 增加问答数据库&#xff0c;通过 Django Admin 添加问题和答案。实现更复杂的问答逻辑&#xff0c;比如使用自然语言处理&#xff08;NLP&#xff09;库。使用前端框架&#xff08;如 Bootstrap&#xff09;增强用户界面 1.注册模型到 Django Admin&#xff08;admin.py…