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

embedded/2024/11/25 15:14:10/

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

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

先看代码:

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.ppmy.cn/embedded/140414.html

相关文章

Java中的关键字 native

Java中的关键字 native 在Java中&#xff0c;native 关键字用于声明本地方法&#xff0c;即由非Java语言&#xff08;如C、C&#xff09;编写的方法。这些本地方法可以通过Java调用&#xff0c;以便访问底层操作系统、硬件资源或遗留代码库。使用 native 关键字的主要目的是让…

Spring Security 中的 AuthenticationProvider接口(验证认证请求)

本篇博客将教您如何在 Spring Security 中使用 AuthenticationProvider 来验证不同的认证逻辑&#xff0c;并展示如何创建自定义的 AuthenticationProvider。 AuthenticationProvider 的作用 AuthenticationProvider 是 Spring Security 中的一个接口&#xff0c;封装了认证逻…

【jvm】为什么要用元空间替代永久代

目录 1. 说明2. 永久代的限制与问题2.1 内存管理限制2.2 垃圾收集效率2.3 类的卸载问题 3. 元空间的优势 1. 说明 1.Java使用元空间替代永久代&#xff0c;这一变化主要源于永久代在实现上存在的限制和问题&#xff0c;以及元空间所提供的更优性能和更高灵活性。2.Java使用元空…

零基础学指针(上)

系列文章目录 &#x1f388; &#x1f388; 我的CSDN主页:OTWOL的主页&#xff0c;欢迎&#xff01;&#xff01;&#xff01;&#x1f44b;&#x1f3fc;&#x1f44b;&#x1f3fc; &#x1f389;&#x1f389;我的C语言初阶合集&#xff1a;C语言初阶合集&#xff0c;希望能…

微信小程序技术架构图

一、视图层1.WXML&#xff08;WeiXin Markup Language&#xff09; 这是微信小程序的标记语言&#xff0c;类似于 HTML。它用于构建小程序的页面结构。例如&#xff0c;通过标签来定义各种视图元素&#xff0c;如<view>&#xff08;类似于 HTML 中的<div>&#xff…

Optional类

0.由来 实际 Java 开发过程中&#xff0c;尝试访问空引用的属性或者调用空引用的方法&#xff0c;会报 空指针异常&#xff08;NullPointerException&#xff09;。处理可能为 null 的值时&#xff0c;需要增加很多 条件判定&#xff0c;比如&#xff1a; &#x1f497;User&…

C语言中的结构体,指针,联合体的使用

目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体&#xff08;联合体&#xff09;10. typedef就是取别名总结 1. 概述 数组&#xff1a;连续的相同数据类型的集合 结构体&#xff1a;不同…

Java将PDF保存为图片

将 PDF 文件转换为图片是常见的需求之一&#xff0c;特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库&#xff0c;可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …