算法入门:二分查找及其Java实现

在程序开发中,算法是解决问题的核心。本篇博客将详细讲解一种高效的查找算法——二分查找,并通过Java代码示例帮助你理解其实现和应用。


如果你觉得这篇文章对你有帮助,不要忘记点赞、收藏和关注我,这将是对我最大的支持和鼓励!

什么是算法?

算法是解决问题的一系列步骤或规则。它们是计算机程序的核心,决定了程序的性能和效率。一个好的算法可以极大地提高程序的运行速度和资源利用率。

大O表示法

大O表示法用于描述算法的效率,特别是它在数据规模增长时的表现。常见的大O表示法包括:

  • O(1):常数时间,不论数据规模多大,执行时间都不变。
  • O(log n):对数时间,常见于二分查找。
  • O(n):线性时间,算法的执行时间与数据规模成正比。
  • O(n log n):线性对数时间,常见于快速排序、归并排序等。
  • O(n^2):平方时间,常见于简单排序算法,如冒泡排序。
  • O(2^n):指数时间,常见于解决复杂问题的递归算法。

二分查找简介

二分查找是一种用于在有序数组中查找特定元素的高效算法。其基本思想是通过逐步缩小查找范围,将查找时间复杂度降低到 O(log n)。相比于线性查找的 O(n),二分查找的效率要高得多。

二分查找步骤

  1. 找到数组的中间元素。
  2. 如果中间元素正好是目标元素,查找成功。
  3. 如果目标元素比中间元素小,则在左半部分继续查找。
  4. 如果目标元素比中间元素大,则在右半部分继续查找。
  5. 重复上述步骤,直到找到目标元素或范围缩小为零。

二分查找图解

在这里插入图片描述

Java实现

下面是一个简单的Java代码实现:

public class BinarySearch {public static int binarySearch(int[] array, int target) {int low = 0;int high = array.length - 1;while (low <= high) {int mid = (low + high) / 2;int guess = array[mid];if (guess == target) {return mid;} else if (guess > target) {high = mid - 1;} else {low = mid + 1;}}return -1; // 表示未找到}public static void main(String[] args) {int[] array = {1, 3, 5, 7, 9};int target = 7;int result = binarySearch(array, target);System.out.println("元素 " + target + " 的索引为: " + result);}
}

代码解释

  1. binarySearch 方法接受一个有序数组和一个目标值作为输入。
  2. 通过初始化 lowhigh 指针,逐步缩小查找范围。
  3. 计算中间位置 mid 并检查其值是否等于目标值。
  4. 根据目标值与中间值的比较结果,调整 lowhigh 指针。
  5. 循环直到找到目标值或范围缩小为零。

算法分析

  • 时间复杂度:二分查找的时间复杂度为 O(log n),因为每次查找都会将查找范围减半。
  • 空间复杂度:二分查找的空间复杂度为 O(1),因为它只使用了常数的额外空间。

示例运行结果

运行上述代码,你将看到以下输出:

元素 7 的索引为: 3

练习题

  1. 修改 binarySearch 方法,使其能处理包含重复元素的数组,并返回第一个匹配的元素。
  2. 实现一个线性查找算法,并比较它与二分查找的性能。

总结

通过本文的学习,我们了解了二分查找的基本概念、实现步骤和Java代码示例。二分查找是一种高效的查找算法,适用于大多数有序数据集的查找问题。


如果你觉得这篇文章对你有帮助,请点赞、收藏,并关注我的CSDN博客。我会持续分享更多高质量的算法和编程知识。

感谢你的阅读和支持!如果有任何问题或建议,欢迎在评论区留言,我会尽快回复。

希望这篇博客对你有帮助。如果有任何问题或需要进一步的解释,请告诉我!

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

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

相关文章

VMware 最新的安全漏洞公告VMSA-2024-0013

#深度好文计划# 一、摘要 2024年6月26日&#xff0c;VMware 发布了最新的安全漏洞公告 VMSA-2024-0013&#xff0c;修复了 VMware ESXi 和 VMware vCenter 中的多个安全漏洞。 VMSA-2024-0013&#xff1a;VMware ESXi 和 vCenter Server 更新修正了多个安全性漏洞 &#xff…

Unity3D 物体的运动

运动方式1 修改 position / localPosition &#xff0c;可以让物体运动 例如&#xff0c; Vector3 pos this.transform.localPosition; pos.z distance; this.transform.localPosition pos; 此时&#xff0c;小车向Z 方向运动 具体代码如下 using System.Collection…

C语言入门课程学习笔记10:结构体联合体位域

C语言入门课程学习笔记10 第48课 - 自定义数据类型&#xff08;上&#xff09;实验-typedef实验小结 第49课 - 自定义数据类型&#xff08;中&#xff09;实验实验小结 第50课 - 自定义数据类型&#xff08;下&#xff09;实验实验小结 第51课 - 多文件程序设计实验实验实验小结…

uni-app picker多列选项

预期实现的效果&#xff1a; 选中后的效果&#xff1a; // Dom部分 <template><picker mode"multiSelector" :range"ssqRange" range-key"name" columnchange"ssqColumnChange" change"ssqChange" class"p…

研究发现GPT-4o等较新的多模态AI模型的安全机制有不足之处

在 ChatGPT 和类似的生成式人工智能模型推出后&#xff0c;很多人都在强调安全问题&#xff0c;政府也参与其中&#xff0c;OpenAI 甚至成立了一个超级协调小组&#xff0c;以阻止未来的人工智能失控&#xff0c;但由于对人工智能安全的发展方向存在分歧&#xff0c;该小组于今…

03逻辑门电路

分立门电路&#xff1a; 集成门电路&#xff1a; TTL门电路 MOS门电路&#xff1a;NMOS门电路、PMOS门电路、CMOS门电路 BICMOS门电路&#xff1a;CMOS的高输入阻抗和TTL的高放大倍数的结合 向更低功耗、更高速度发展 MOS管的Rdson在可变电阻区的阻值也一般会小于1000欧姆 …

达梦数据库的系统视图v$locked_object

达梦数据库的系统视图v$locked_object 在达梦数据库&#xff08;Dameng Database&#xff09;中&#xff0c;V$LOCKED_OBJECT 视图提供了与数据库中被锁定对象相关的信息。这通常用于监控和诊断数据库中的锁定问题&#xff0c;帮助管理员了解哪些对象被锁定了&#xff0c;以及…

1.回溯算法.基础

1.回溯算法 基础知识题目1.组合2.组合-优化3.组合总和|||4.电话号码和字母组合5.组合总和6.组合总和II7.分割回文串8.复原IP地址 基础知识 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯 因为回溯的本质是穷…

Excel 宏录制与VBA编程 —— 11、工作表及工作簿操作(附:Worksheets与Sheets区别)

代码1 - Worksheets与Sheets区别 Worksheets表示普通工作表;Sheets即可表示普通工作表也可表示图标工作表。 下面模块中代码结果是一样的,大家理解时可结合上面区别说明进行了解 Sub Test()Worksheets("Sheet1").Range("A1").Value 100Sheets("Sheet…

BioCLIP:物种图像的基础视觉模型

从无人机到个人手机&#xff0c;各种相机收集的自然世界图像是越来越丰富的生物信息来源。从图像中提取生物相关信息用于科学的计算方法和工具激增&#xff0c;尤其是计算机视觉。然而&#xff0c;其中大多数都是为特定任务设计的&#xff0c;不容易适应或扩展到新的问题、环境…

【AI大模型】Transformers大模型库(十二):Evaluate模型评估

目录 一、引言 二、Evaluate模型评估 2.1 概述 2.2 使用方法 2.2.1 步骤1: 导入必要的库 2.2.2 步骤2: 加载模型和分词器 2.2.3 步骤3: 准备数据集 2.2.4 步骤4: 数据预处理 2.2.5 步骤5: 创建训练和评估数据集 2.2.6 步骤6: 设置训练参数并创建Trainer 2.2.7 步…

基于Flask开发的前后端交互项目(可用于期末大作业) MySQL数据库 文件上传 Spider爬虫 Echarts可视化展示 JS动态

项目描述&#xff1a; 开发一个基于Flask框架开发的前后端交互项目&#xff0c;项目内容为 东京奥运会 。对各个需要填写的字段做了数据验证&#xff0c;非法信息会被JS拦截提醒不合法&#xff1b;还对未登录就访问做了拦截&#xff0c;阻止未登录就访问。 前端&#xff1a;HT…

idea 开发工具properties文件中的中文不显示

用idea打开一个项目&#xff0c;配置文件propertise中的中文都不展示&#xff0c;如图&#xff1a; 可修改idea配置让中文显示&#xff1a; 勾选箭头指向的框即可&#xff0c;点击应用保存&#xff0c;重新打开配置文件&#xff0c;显示正常

Java开发环境配置

一、JDK 下载JDK&#xff1a;Java Downloads | Oracle 配置环境变量&#xff1a;09、Java入门&#xff1a;Path、JAVA_HOME环境变量配置_哔哩哔哩_bilibili 二、IDEA 下载IDEA&#xff1a; Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) 建…

HotSpot 垃圾收集器

文章目录 前言HotSpot 垃圾收集器1. 查看jdk默认垃圾收集器命令2. 查看当前服务使用的是哪个垃圾收集器:3. 常用的垃圾收集器3.1. 并行垃圾收集器&#xff08;Parallel Garbage Collector&#xff09;3.2. CMS 垃圾收集器&#xff08;Concurrent Mark-Sweep Garbage Collector&…

情感分析方法与实践

第1关&#xff1a;情感分析的基本方法 情感分析简介 情感分析&#xff0c;又称意见挖掘、倾向性分析等。简单而言&#xff0c;是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。在日常生活中&#xff0c;情感分析的应用非常普遍&#xff0c;下面列举几种常见的…

Gradle学习-3 Gradle插件

1、Gredle插件是什么 Gradle插件是用于扩展和增强Gradle构建系统的功能模块通过插件&#xff0c;Gradle可以执行各种构建任务&#xff0c;如编译代码、打包应用、运行测试等 Gradle插件主要分为&#xff1a;二进制插件、脚本插件 二进制插件二进制插件是预编译的、可以复用的…

web学习笔记(七十二)

目录 1.vue2通过$parent实现组件传值——父传子 2.vue2 通过$children实现组件传值——子传父 3. provide和inject传值&#xff08;依赖注入&#xff09; 4.vue2如何操作dom 5.vue2如何拿到最新的dom 6.filters过滤器 7.vue2的生命周期 8.vuex的用法 1.vue2通过$parent…

大数据开发需要哪些职场知识

职场是个人情世故的江湖&#xff0c;除了专业技能&#xff0c;成功的大数据开发人员还需要掌握多种职场知识。以下是一些重要的职场知识和技能&#xff0c;结合实际例子详细说明。 目录 理论知识与工程实践理论知识工程实践例子 项目经验总结项目管理总结和反思例子 做事方式方…

一招教你搞定Windows系统指定IP不变[固定IP地址方法]

1.打开控制面板&#xff0c;找到“网络和Internet” 点击进入&#xff1a; 2.点击打开“网络和共享中心”后&#xff0c;选择“更改适配器选项”。 3.点击 “查看此连接的状态”&#xff0c; 接着点击“详细信息” 查看信息。记录当前的IP地址是 10.88.x.xx&#xff0c;后面我们…