当前位置: 首页 > news >正文

二分查找(折半查找)

  • 这次不排序了,对排好序的数组做个查找吧

介绍

  • 二分查找排序英文名为BinarySort,是一种效率较高的查找方法
  • 要求线性表必须采用顺序存储结构

基本思路

  • 通过不断地将搜索范围缩小一半来找到目标元素:
    • 1、假定数组为arr,需要查找的值为target
    • 2、定义left、right 和mid三个索引。mid=(left+right)/2;
    • 3、如果中间元素正好是要查找的元素,搜索结束;
      ( 即arr[mid]==target,结束)
    • 4、如果目标元素大于中间元素,那么在数组的右半部分继续查找
      ( 即arr[mid]>target,循环或者递归右半部分)
    • 5、如果目标元素小于中间元素,那么在数组的左半部分继续查找
      ( 即arr[mid]<target,循环或者递归左半部分)
    • 6、重复以上步骤,直到找到目标元素或者搜索范围为空(找不到目标值)

代码

  • 循环方法

    public static void main(String[] args) {int[] arr = {1,10, 20, 30, 40, 50, 60, 70, 80, 90};sort(arr,60);sort(arr,45);sort(arr,1);
    }public static int sort(int[] arr,int target){int left = 0;int right = arr.length-1;while(left<=right){ // 此处=是为了当索引移动后只剩一个时,也需要比较int mid = (left+right)/2; // 放在while循环外边就成了固定值了if(arr[mid]==target){System.out.println("找到了!");return mid;}else if(arr[mid]<target){ // 目标值比中间值大,要往右边查找left = mid+1;}else{    // 目标值比中间值小,要往左边查找right = mid-1;}}System.out.println("没有该数值");return -1;
    }
    ------------输出结果--------------
    找到了【60】,位置是:6
    数值【45】不存在
    找到了【1】,位置是:0
    
  • 递归方法

    public static void main(String[] args) {int[] arr = {1,10, 20, 30, 40, 50, 60, 70, 80, 90};digui(arr,60,0,arr.length-1);digui(arr,45,0,arr.length-1);digui(arr,1,0,arr.length-1);
    }
    public static int digui(int[] arr,int target,int left,int right){if(left>right){System.out.println("不存在该数值");return -1;}int mid = (left+right)/2;if(arr[mid]==target){System.out.println("找到了!");return mid;}else if(arr[mid]>target){ // 目标值比中间值小return digui(arr,target,left,mid-1);}else{return digui(arr,target,mid+1,right);}
    }
    ------------输出结果--------------
    找到了【60】,位置是:6
    数值【45】不存在
    找到了【1】,位置是:0
    

老规矩,来个流程图

  • 希望这三张图能帮忙大家理解为什么left<=right
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

时间复杂度

  • 最好情况是O(1),即一下就找到了
  • 平均是O(logN)

相关文章:

二分查找(折半查找)

这次不排序了&#xff0c;对排好序的数组做个查找吧 介绍 二分查找排序英文名为BinarySort&#xff0c;是一种效率较高的查找方法要求线性表必须采用顺序存储结构 基本思路 通过不断地将搜索范围缩小一半来找到目标元素&#xff1a; 1、假定数组为arr&#xff0c;需要查找的…...

arcgis紧凑型切片缓存(解决大范围切片,文件数量大的问题)

ArcGIS 切片缓存的紧凑型存储格式是一种优化的存储方式&#xff0c;用于提高切片缓存的存储效率和访问速度。紧凑型存储格式将多个切片文件合并为一个单一的 .bundle 文件&#xff0c;从而减少文件系统的开销和切片的加载时间。这类格式已经应用很久了&#xff0c;我记得2013我…...

ESP32CAM人工智能教学15

ESP32CAM人工智能教学15 Flask服务器TCP连接 小智利用Flask在计算机中创建一个虚拟的网页服务器服务器&#xff0c;让ESP32Cam通过WiFi连接&#xff0c;把摄像头拍摄到的图片发送到电脑中&#xff0c;并在电脑中保存成图片文件。 Flask是用Python编写的网页服务程序WebServer。…...

Pandas 33个冷知识 0721

Pandas 33个冷知识 从Excel读取数据: 使用 pd.read_excel(file.xlsx) 来读取Excel文件。 写入Excel: 使用 df.to_excel(file.xlsx, indexFalse) 将DataFrame写入Excel文件。 创建日期索引: 使用 df.set_index(pd.to_datetime(df[date])) 创建日期索引。 向后填充缺失值: 使用…...

C++ map和set的使用

目录 0.前言 1.关联式容器 2.键值对 3.树形结构的关联式容器 3.1树形结构的特点 3.2树形结构在关联式容器中的应用 4.set 4.1概念与性质 4.2使用 5.multiset 5.1概念与性质 5.2使用 6.map 6.1概念与性质 6.2使用 7.multimap 7.1概念与性质 7.2使用 8.小结 &a…...

yarn的安装和配置以及更新总结,npm的对照使用差异

1. Yarn简介 Yarn 是一个由 Facebook 开发的现代 JavaScript 包管理器&#xff0c;旨在提供更快、更安全、更可靠的包管理体验。 1.1 什么是Yarn Yarn 是一个快速、可靠和安全的 JavaScript 包管理器&#xff0c;它通过并行化操作和智能缓存机制&#xff0c;显著提升了依赖安…...

【Git命令】git rebase之合并提交记录

使用场景 在本地提交了两个commit&#xff0c;但是发现根本没有没必要分为两次&#xff0c;需要想办法把两次提交合并成一个提交&#xff1b;这个时候可以使用如下命令启动交互式变基会话&#xff1a; git rebase -i HEAD~N这里 N 是你想要重新调整的最近的提交数。 如下在本地…...

为什么品牌需要做 IP 形象?

品牌做IP形象的原因有多方面&#xff0c;这些原因共同构成了IP形象在品牌建设中的重要性和价值&#xff0c;主要原因有以下几个方面&#xff1a; 增强品牌识别度与记忆点&#xff1a; IP形象作为品牌的视觉符号&#xff0c;具有独特性和辨识性&#xff0c;能够在消费者心中留…...

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中&#xff0c;我们讨论了什么是 CRI 和 OCI&#xff0c;Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近&#xff0c;我们得知 Docker 即将从 kubernetes 中弃用&#xff01;&#xff08;查看 kubernetes 官方的这篇文章&#xff09;那么让我…...

70. 爬楼梯【 力扣(LeetCode) 】

一、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 二、测试用例 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶…...

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…...

XMl基本操作

引言 使⽤Mybatis的注解⽅式&#xff0c;主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能&#xff0c;建议使⽤XML来配置映射语句&#xff0c;也就是将SQL语句写在XML配置⽂件中. 之前&#xff0c;我们学习了&#xff0c;用注解的方式来实现MyBatis 接下来我们…...

Linux——Shell脚本和Nginx反向代理服务器

1. Linux中的shell脚本【了解】 1.1 什么是shell Shell是一个用C语言编写的程序&#xff0c;它是用户使用Linux的桥梁 Shell 既是一种命令语言&#xff0c;有是一种程序设计语言 Shell是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…...

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…...

【web】-flask-简单的计算题(不简单)

打开页面是这样的 初步思路&#xff0c;打开F12&#xff0c;查看头&#xff0c;都发现了这个表达式的base64加密字符串。编写脚本提交答案&#xff0c;发现不对&#xff1b; 无奈点开source发现源代码&#xff0c;是flask,初始化表达式&#xff0c;获取提交的表达式&#xff0…...

Apache Sqoop

Apache Sqoop是一个开源工具&#xff0c;用于在Apache Hadoop和关系型数据库&#xff08;如MySQL、Oracle、PostgreSQL等&#xff09;之间进行数据的批量传输。其主要功能包括&#xff1a; 1. 数据导入&#xff1a;从关系型数据库&#xff08;如MySQL、Oracle等&#xff09;中将…...

【Python】TensorFlow介绍与实战

TensorFlow介绍与使用 1. 前言 在人工智能领域的快速发展中&#xff0c;深度学习框架的选择至关重要。TensorFlow 以其灵活性和强大的社区支持&#xff0c;成为了许多研究者和开发者的首选。本文将进一步扩展对 TensorFlow 的介绍&#xff0c;包括其优势、应用场景以及在最新…...

第100+16步 ChatGPT学习:R实现Xgboost分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现Xgboost分类 &#xff08…...

【操作系统】定时器(Timer)的实现

这里写目录标题 定时器一、定时器是什么二、标准库中的定时器三、实现定时器 定时器 一、定时器是什么 定时器也是软件开发中的⼀个重要组件.类似于⼀个"闹钟".达到⼀个设定的时间之后,就执行某个指定 好的代码. 定时器是⼀种实际开发中⾮常常用的组件. ⽐如⽹络通…...

鸿蒙Navigation路由能力汇总

基本使用步骤&#xff1a; 1、新增配置文件router_map&#xff1a; 2、在moudle.json5中添加刚才新增的router_map配置&#xff1a; 3、使用方法&#xff1a; 属性汇总&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-compone…...

锂电池热失控防护:从封装技术到系统级安全设计

1. 从三星Note 7到航天器&#xff1a;锂电池安全问题的根源与演进2016年&#xff0c;三星Galaxy Note 7的“燃损门”事件&#xff0c;将锂电池安全问题以一种极其戏剧化且代价高昂的方式&#xff0c;推到了全球消费者和整个电子产业的聚光灯下。官方调查最终指向了电池设计缺陷…...

HDiffPatch嵌入式系统应用:如何在MCU和NB-IoT设备上实现OTA更新

HDiffPatch嵌入式系统应用&#xff1a;如何在MCU和NB-IoT设备上实现OTA更新 【免费下载链接】HDiffPatch a C\C library and command-line tools for Diff & Patch between binary files or directories(folder); cross-platform; runs fast; create small delta/different…...

从理论到实践:LQR在二自由度云台控制系统中的参数整定与仿真验证

1. LQR控制器的工程实践意义 二自由度云台在工业自动化、智能监控等领域应用广泛&#xff0c;但传统PID控制往往难以兼顾快速响应和稳定性的双重需求。LQR&#xff08;线性二次型调节器&#xff09;作为现代控制理论中的经典方法&#xff0c;通过优化目标函数实现对系统的精确控…...

阿里AI产品经理实习深度解析:从业务痛点到评估体系,手把手拆解求职攻略!

本文详细拆解了阿里AI产品经理实习岗位的核心职责与面试要点&#xff0c;强调理解业务场景、设计AI应用流程、运用Prompt技术、评估产品效果等关键能力。文章指出&#xff0c;该岗位不仅需要掌握AI基础概念&#xff0c;更要具备业务洞察力、问题拆解能力及数据驱动优化能力&…...

对比直接使用原厂API,Taotoken在计费透明度上的体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比直接使用原厂API&#xff0c;Taotoken在计费透明度上的体验 对于个人开发者而言&#xff0c;在项目开发中集成大模型能力时&am…...

Mali-400 MP OpenGL ES DDK核心问题与解决方案

## 1. Mali-400 MP OpenGL ES DDK核心问题解析作为ARM经典的移动GPU架构&#xff0c;Mali-400 MP在Symbian平台的OpenGL ES驱动开发套件(DDK)中存在三类典型问题。这些问题的根源往往涉及GPU硬件特性与图形API规范的微妙交互&#xff0c;开发者需要深入理解其底层机制才能有效规…...

技术奇点之后,人类程序员的历史角色

当人工智能越过技术奇点&#xff0c;代码生成、测试用例设计乃至系统运维都将发生质变。本文从软件测试从业者的视角出发&#xff0c;系统探讨人类程序员在奇点之后可能扮演的六种核心角色&#xff1a;系统守护者、需求翻译官、质量伦理法官、人机交互设计师、持续学习组织者与…...

YOLO26改进 | MSHC多尺度异构卷积:用方形核与条带核捕获复杂空间纹理,以清晰动机打造超强创新!

# YOLO26改进最新创新改进系列 | MSHC多尺度异构卷积&#xff1a;用方形核与条带核捕获复杂空间纹理&#xff0c;以清晰动机打造超强创新&#xff01; 购买相关资料后畅享一对一答疑&#xff01; 畅享超多免费持续更新且可大幅度提升文章档次的纯干货工具&#xff01; 这篇采用…...

电能质量治理三相光伏逆变器设计【附程序】

✨ 长期致力于MPPT、电能质量治理、改进哈里斯鹰、重复控制、预置补偿角、模糊PI研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于混沌哈里斯鹰算法…...

WPF中OxyPlot不同图表的使用

在 WPF 中使用 OxyPlot 实现不同图表&#xff0c;核心在于创建和配置PlotModel对象&#xff0c;并将其绑定到PlotView控件上进行显示。通过向PlotModel中添加不同类型的Series&#xff08;数据系列&#xff09;&#xff0c;即可轻松实现折线图、柱状图、饼图、散点图等多种图表…...