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

news2024/11/25 7:26:04

在程序开发中,算法是解决问题的核心。本篇博客将详细讲解一种高效的查找算法——二分查找,并通过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.coloradmin.cn/o/1870865.html

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

相关文章

Vue.js中的虚拟DOM

一.节点和状态 在我们平常对DOM操作的时候,之前在vue没有诞生之前,以命令式的方式对DOM进行操作,页面上的每一个元素都可以看做成一个节点状态。 二.剔除和渲染 框架都有自己渲染的方式,假设一个页面的状态,随着Ajax请求的放松,状态发生改变,有以下的两种方式供你选择&#…

CVE-2024-37032漏洞预警:尽快升级Ollama

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

生成随机函数f3,利用f3生成f18(python)

一、题目 给定一个完全随机函数f3。能够完全随机产生1~3之间任意一个自然数。现在要构造一个f18&#xff0c;让其能随机产生1~18之间任意一个自然数&#xff0c;要求写出f18的函数&#xff0c;另外要测试是否符合预期&#xff0c;f18要用f3 二、代码 欢迎大家给我更优解&…

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击

import pyautogui import cv2 import numpy as np import mathdef find_and_click(template_path, target_x, target_y, match_threshold0.8):"""在屏幕上查找目标图片并点击。Args:template_path: 目标图片的路径。target_x: 预设的坐标 x 轴值。target_y: 预设…

Jenkins教程-10-发送飞书测试报告通知

上一小节我们学习了发送企业微信测试报告通知的方法&#xff0c;本小节我们讲解一下发送飞书测试报告通知的方法。 1、自动化用例执行完后&#xff0c;使用pytest_terminal_summary钩子函数收集测试结果&#xff0c;存入本地status.txt文件中&#xff0c;供Jenkins调用 conft…

计算机视觉-期末复习-简答/名词解释/综合设计

目录 第一讲--计算机/机器视觉概述 名词解释 简答 第二讲--图像处理概述 名词解释 简答 第三讲没划重点习题 第四讲--特征提取与选择 名词解释 简答 综合题 第五讲--不变特征 名词解释 简答 第六讲--物体分类与检测 简答 综合题 第七讲--视觉注意机制 简答 …

大数据------JavaWeb------MyBatis(完整知识点汇总)

MyBatis MyBatis简介 定义 它是一款优秀的持久层框架&#xff0c;用于简化JDBC开发它原来是Apache的一个开源项目iBatis&#xff0c;后来改名为MyBatis中文官网&#xff1a;https://mybatis.org/mybatis-3/zh_CN/index.html JaveEE三层架构 表现层&#xff08;做页面展示&…

零知识证明基础:对称加密与非对称加密

1、绪论 在密码学体系中&#xff0c;对称加密、非对称加密、单向散列函数、消息认证码、数字签名和伪随机数生成器被统称为密码学家的工具箱。其中&#xff0c;对称加密和非对称加密主要是用来保证机密性&#xff1b;单向散列函数用来保证消息的完整性&#xff1b;消息认证码的…

ODYSSEE加速电机仿真优化

由于对低碳社会的强烈需求&#xff0c;电动汽车(EV)和混合动力汽车(HEV)的数量正在迅速增长。新能源汽车的主要部件是电池、逆变器和电机。电机市场的规模也将不断扩大。为了提高EV的性能&#xff0c;对电机设计工程师的要求越来越高。 除了EV市场&#xff0c;协作机器人市场也…

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…

华为HCIP Datacom H12-821 卷16

1.判断题 在 VRRP 中,当设备状态变为 Master 后,,会立刻发送免费 ARP 来刷新下游设备的 MAC 表项,从而把用户的流量引到此台设备上来 A、对 B、错 正确答案: A 解析: 2.判断题 路由选择工具 route- policy 能够基于预先定义的条件来进行过滤并设置 BGP

5.9k!一款清新好用的后台管理系统!【送源码】

今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的&#xff1a; Soybean Admin 使用的是Vue3作为前端框架&#xff0c;TypeScript作为开发语言&#xff0c;同时还整合了NaiveUI组件库&#xff0c;使得系统具有高可用性和…

原创作品—医疗行业软件界面UI、交互设计

在医疗行业大屏UI设计中&#xff0c;首要的是以用户为中心&#xff0c;深入理解医生、护士、管理层等用户群体的具体需求和工作流程。大屏设计应直观展示关键医疗数据、患者信息、设备状态等&#xff0c;确保用户能够迅速、准确地获取所需信息。同时&#xff0c;功能布局应合理…

用户中心项目全流程

企业做项目流程 需求分析 > 设计&#xff08;概要设计 、 详细设计&#xff09; > 技术选型 >初始化项目 / 引入需要的技术 > 写个小demo > 写代码 &#xff08;实现业务逻辑&#xff09; > 测试&#xff08;单元测试&#xff09;> 代码提交 / 代码评审 …

idea http client GET 请求 报503错误

idea 提供的 http client 插件&#xff0c;在 GET 请求时总是 报503 的错误&#xff0c;但请求URL可以在浏览器中正常访问。 GET localhost:8080/student Response file saved. > 2024-06-20T160906.503.html 有一种原因跟本地配置的代理有关&#xff0c;如下图。如果在…

unidbg介绍

1.unicorn介绍 好比是一个CPU&#xff0c;可以模拟执行各种指令 提供了很多编程语言接口&#xff0c;可以操作内存、寄存器等 但它不是一个系统&#xff0c;内存管理、文件管理、系统调用等都需要自己来实现 2.基于unicorn开发的框架 cemu用来学习汇编的工具 AndroidNativeEm…

AcWing算法基础课笔记——最短Hamilton路径

最短Hamilton路径 题目 给定一张 n 个点的带权无向图&#xff0c;点从 0~n-1 标号&#xff0c;求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数n。 接下来 n 行每行n个整数&#xff0c…

SpringCloud分布式微服务链路追踪方案:Skywalking

一、引言 随着微服务架构的广泛应用&#xff0c;系统的复杂性也随之增加。在这种复杂的系统中&#xff0c;应用通常由多个相互独立的服务组成&#xff0c;每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性&#xff0c;但也带来了新的挑战&#xf…

第六篇:精通Docker Compose:打造高效的多容器应用环境

精通Docker Compose&#xff1a;打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中&#xff0c;随着应用程序的复杂性不断增加&#xff0c;传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具&#xff0c;专门用于定义和运行多容器…

【Spring】Spring学习笔记

Spring数据库 Spring JDBC 环境准备 创建Spring项目, 添加以下依赖 H2 Database: 用于充当嵌入式测试数据库JDBC API: 用于连接数据库Lombok: 用于简化pojo的编写 然后添加配置文件: spring.output.ansi.enabledALWAYS spring.datasource.username*********** spring.dataso…