数据结构-二分查找Java实现

目录

  • 一、引言
  • 二、算法步骤
  • 三、原理演示
  • 四、代码实战
  • 五、结论

一、引言

    二分查找,也被称为二分搜索或折半查找,是一种用于在有序数组或列表中查找特定元素的高效算法。其基本思想是将查找范围逐步缩小,直到找到目标元素或确定目标元素不存在。二分查找的时间复杂度为O(log n),相对于线性查找的O(n)来说,效率非常高。

二、算法步骤

二分查找的基本步骤如下:

  1. 准备工作: 二分查找要求目标数组必须是有序的,可以是升序或降序。通常,数组需要按升序排列。
  2. 初始化边界: 初始化两个指针,一个指向数组的起始位置,另一个指向数组的结束位置。这些指针表示当前查找范围。
  3. 查找中间元素: 计算中间元素的索引,通常通过 (左边界 + 右边界) / 2 来获得。这个中间元素用于与目标元素进行比较。
  4. 比较中间元素: 将中间元素与目标元素进行比较。如果中间元素等于目标元素,查找成功,返回中间元素的索引。
  5. 缩小查找范围: 如果中间元素大于目标元素,说明目标元素位于中间元素的左侧,此时将右边界指针移动到中间元素前一个位置。如果中间元素小于目标元素,说明目标元素位于中间元素的右侧,此时将左边界指针移动到中间元素后一个位置。
  6. 重复过程: 重复步骤 3 和步骤 4 直到找到目标元素或确定目标元素不存在。如果左边界大于右边界,说明目标元素不在数组中,查找失败。

三、原理演示

假设我们有一个有序数组 arr,如下所示:
arr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
我们的目标是查找数字 12 是否在数组中,以及它的索引位置。
步骤1 - 初始化: 初始时,我们有两个指针,left 指向数组的起始位置,right 指向数组的结束位置。
left = 0
right = 9
步骤2 - 计算中间元素: 现在,我们计算中间元素的索引。 (left + right) / 2 为 (0 + 9) / 2,所以中间元素的索引为 4。
步骤3 - 比较中间元素: 我们将中间元素 arr[4] 与目标元素 12 进行比较。 arr[4] 是 10,这小于 12。因此,我们知道目标元素 12 应该在中间元素的右侧。
步骤4 - 重复过程: 现在,我们更新左右边界指针,以便缩小查找范围。由于目标元素在中间元素的右侧,我们将 left 更新为 mid + 1。
left = 5
right = 9
再次计算中间元素: 计算新的中间元素, (left + right) / 2 为 (5 + 9) / 2,中间元素的索引为 7。
再次比较中间元素: 我们将中间元素 arr[7] 与目标元素 12 进行比较。 arr[7] 是 16,这大于 12。因此,我们知道目标元素 12 应该在中间元素的左侧。
继续更新边界指针: 我们将 right 更新为 mid - 1。
left = 5
right = 6
再次计算中间元素: 计算新的中间元素, (left + right) / 2 为 (5 + 6) / 2,中间元素的索引为 5。
再次比较中间元素: 我们将中间元素 arr[5] 与目标元素 12 进行比较。 arr[5] 正好是目标元素 12。查找成功,我们找到了目标元素。

四、代码实战

以下是一个简单的二分查找代码示例:

public class BinarySearch {public static int binarySearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid; // 找到目标元素,返回索引}if (arr[mid] < target) {left = mid + 1; // 目标元素在右半部分} else {right = mid - 1; // 目标元素在左半部分}}return -1; // 目标元素不在数组中}public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int target = 6;int result = binarySearch(arr, target);if (result != -1) {System.out.println("目标元素 " + target + " 在索引 " + result + " 处找到。");} else {System.out.println("目标元素 " + target + " 未找到。");}}
}

五、结论

我们一起来总结一下:

  1. 时间复杂度:二分查找的时间复杂度为O(log n),其中n是数组的元素数量。这使得二分查找在处理大规模数据时,效率优于许多其他搜索算法。
  2. 适用场景:二分查找只适用于已排序的数组。这是因为在搜索过程中,我们需要确定目标元素在哪一半中,而这只能在已排序的数组中快速完成。
  3. 实现:二分查找的实现非常简单,只需要确定目标元素在哪一半中,然后在那一半中继续搜索。每次循环,我们都将搜索范围减半。
  4. 稳定性和空间复杂度:二分查找是稳定的算法,也就是说,它不会改变输入数组的顺序。此外,它的空间复杂度为O(1),因为它不需要额外的存储空间。
  5. 查找非排序数组:如果要在未排序的数组中查找元素,通常的做法是先对数组进行排序,然后使用二分查找。但是,你也可以使用其他搜索算法,如线性搜索。
  6. 查找有序但非整数数组:二分查找只适用于整数数组,但如果要在其他类型的数组(如字符串或浮点数数组)中查找元素,可能需要使用其他搜索算法。
  7. 最坏情况和最好情况:在最好的情况下(即目标元素位于数组的第一个或最后一个位置),二分查找只需要进行一次比较。在最坏的情况下(即目标元素位于数组的中间位置),二分查找需要进行n次比较。然而,由于平均情况下二分查找只需要进行log n次比较,因此它的平均性能仍然非常好。
  8. 错误处理:如果数组中存在重复元素,二分查找可能会返回错误的结果。例如,在一个包含多个相同元素的数组中,二分查找可能会返回任何一个相同元素的索引,而不是目标元素的索引。为了解决这个问题,你可以在每次找到目标元素时检查其索引是否与前一个元素的索引不同。
  9. 扩展应用:除了基本的二分查找之外,还可以扩展出许多其他的应用,例如找到一个数列的中位数、在一个数列中寻找一个数出现的最早的索引等。

点赞收藏,富婆包养✋✋

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

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

相关文章

分布式存储系统Ceph应用组件介绍

1、 无中心架构分布式存储Ceph Ceph是一套开源的分布式存储系统。具有可靠性高&#xff0c;性能优良&#xff0c;可伸缩&#xff0c;与HDFS不同的地方在于&#xff0c;该架构中没有中心节点。 Ceph优点在于它不单单是存储&#xff0c;同时还充分利用了存储节点上的计算能…

赛宁网安多领域创新成果亮相第五届“纵横”论坛

10月27日&#xff0c;第五届“纵横”网络空间安全创新论坛在安徽合肥举办&#xff0c;来自中央国家机关、地方政府、军队有关单位、高校、科研院所和部分高新技术企业的领导、专家和代表500余人参加。 本届论坛由军事科学院和国防科技大学等单位共同主办&#xff0c;国防科技大…

JavaScript开发技巧(上篇)

JavaScript开发技巧&#xff08;上篇&#xff09; 1、前言2、从数组中删除假值3、数组搜索4、空值合并运算符5、逻辑或赋值运算符6、多值匹配7、三元表达式8、短路评估9、科学计数法10、位运算符11、指数求幂 1、前言 JavaScript中有很多速记技巧&#xff0c;可以缩短代码长度…

【原创】java+swing+mysql个人理财管理系统设计与实现

摘要&#xff1a; 个人理财管理系统是一款帮助用户有效管理个人财务的软件&#xff0c;本文将详细介绍该系统的设计过程&#xff0c;包括功能模块、数据库设计、界面设计等&#xff0c;系统采用javaswingmysql技术组合。 功能分析&#xff1a; 系统主要提供给管理员、用户使…

金蝶云星空创建自动下推并保存公共服务

文章目录 金蝶云星空创建自动下推并保存公共服务创建公共方法按单下推数据按明细行下推数据调用下推操作 调用公共方法 金蝶云星空创建自动下推并保存公共服务 创建公共方法 按单下推数据 /// <summary>/// 获取单据转换数据包/// </summary>public DynamicObjec…

M3重磅来袭 苹果多款新品上架

10月31日早上8点&#xff0c;苹果举行了新品发布会&#xff0c;正式发布了M3、M3 Pro、 M3 Max芯片&#xff0c;以及基于新款芯片打造的14英寸和16英寸MacBook Pro、新款iMac。 我们现在花一分钟&#xff0c;简单了解一下这次的新品。 M3、M3 Pro、M3 Max M3系列芯片就是M2系…

关于测试组件junit切换testng的示例以及切换方式分享

文章目录 概要首先看看junit和testng的区别实践篇摸拟业务逻辑代码简单对象数据层摸拟类业务逻辑层摸拟类后台任务摸拟类 基于springmockjunit基于springmocktestng 示例的差异点junit与testng的主要变动不大,有以下几个点需要注意注解部分在before,after中testng多出按配置执行…

Spring 事务不生效的几种场景

Spring 事务不生效的几种场景 详细内容参考以下链接&#xff0c;这个链接是原文&#xff1a; spring 事务不生效的15中场景 非原创。 以下内容只是为了学习&#xff0c;加深印象&#xff0c;仅作为个人学习笔记&#xff0c; 请支持原创&#xff0c;内容请点击 spring 事务不生效…

链动2+1模式:白酒产品的营销新策略

链动21模式是一种创新的营销模式&#xff0c;结合白酒产品更能发挥其优势。该模式通过独特的身份晋升和奖励机制&#xff0c;快速建立销售渠道&#xff0c;提高用户粘性。 一、核心机制 身份晋升机制&#xff1a;用户购买指定499白酒产品后成为代理&#xff0c;再邀请两位用户…

新风机如何联动?

数据中心的运行会产生大量的热量&#xff0c;因为其中包含了大量的服务器、存储设备以及网络设备等&#xff0c;它们需要消耗大量的电力来进行计算和数据处理。为了保证这些设备运行的稳定性和性能&#xff0c;数据中心必须维持适宜的温度和湿度。 新风系统可以在数据中心中起到…

小米澎湃OS发布,雷军小米的“统一”大棋局

千呼万唤始出来。2023年10月26日&#xff0c;小米澎湃OS终于揭开面纱。 雷军在主题为“跨越时刻”的发布会上&#xff0c;正式发布了小米澎湃OS。面对这款历时七年打造的全新操作系统&#xff0c;雷军难掩兴奋&#xff0c;他感慨道&#xff1a;“我心澎湃”。 小米新操作系统取…

微信小程序项目案例之导游证考试刷题小程序

前言 很多计算机专业的同学在做毕设选题时不知道该如何选题&#xff0c;有的同学是已经选择了要开发一款小程序&#xff0c;但是又不知道开发哪类小程序。本篇将为大家介绍一个小程序的开发方向&#xff0c;考试刷题类小程序是目前比较火的小程序项目之一&#xff0c;在小程序…

CB2-2CARD的openSUSE远程SSH登录提示优化

CB2-2CARD的openSUSE远程SSH登录提示优化 1. 源由2. 优化内容2.1 去掉Password/banner前后的prompts提示语句2.2 增加logo登录界面2.3 增加系统运行情况简单汇报2.4 增加banner 3. 优化效果 1. 源由 之前运行的CB2-2CARD的openSUSE安装&NAS环境配置服务器已经运行也有段时…

(c语言进阶)字符串函数、字符分类函数和字符转换函数

一.求字符串长度 1.strlen() (1)基本概念 头文件&#xff1a;<string.h> (2)易错点&#xff1a;strlen()的返回值为无符号整形 #include<stdio.h> #include<string.h> int main() {const char* str1 "abcdef";const char* str2 "bbb&q…

审核 Microsoft SQL Server 日志

手动审核数据库活动是一项艰巨的任务&#xff0c;有效完成审计的最佳方法是使用简化和自动化数据库监控的综合解决方案&#xff0c;该解决方案还应使数据库管理员能够监控、跟踪和即时识别任何操作问题的根本原因&#xff0c;并实时检测对机密数据的未经授权的访问。 什么是 S…

前端面试 面试多起来了

就在昨天 10.17 号,同时收到了三个同学面试的消息。他们的基本情况都是双非院校本科、没有实习经历、不会消息中间件和 Spring Cloud 微服务,做的都是单体项目。但他们投递简历还算积极,从今年 9 月初就开始投递简历了,到现在也有一个多月了。 来看看,这些消息。 为…

找到Linux中最大的目录和文件

寻找下一层最大的文件夹 du -h --max-depth1Linux上查找最大文件的3种方法 第一种&#xff1a;ls 最简单的方法就是借助 ls 命令&#xff0c;因为 ls 命令本身输出是带文件大小信息的。 比如&#xff0c;我要列出 /data/log/ 目录中的20个最大文件&#xff0c;可以&#xf…

中文编程工具免费版下载,中文开发语言工具免费版下载

中文编程工具免费版下载&#xff0c;中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502

RabbitMQ消息中间件

一、初始MQ 首先了解一下微服务间通讯有同步和异步两种方式&#xff1a;- 同步通讯&#xff1a;是指两个或多个系统在进行信息交换时&#xff0c;必须在同一时刻进行操作 - 异步通讯&#xff1a;是指两个或多个系统之间的通讯方式&#xff0c;其中发送方和接收方不是在同一时刻…

星环科技分布式向量数据库Transwarp Hippo正式发布,拓展大语言模型时间和空间维度

随着企业、机构中非结构化数据应用的日益增多以及AI的爆发式增长所带来的大量生成式数据&#xff0c;所涉及的数据呈现了体量大、格式和存储方式多样、处理速度要求高、潜在价值大等特点。但传统数据平台对这些数据的处理能力较为有限&#xff0c;如使用文件系统、多类不同数据…