算法系列之搜素算法-二分查找

news/2025/2/26 3:13:44

_20250224201229.jpg

算法中,查找算法是处理数据集合的基础操作之一。二分查找(Binary Search)是一种高效的查找算法,适用于有序数组或列表。本文将介绍二分查找的基本原理、Java实现。

二分查找介绍

二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是通过将数组分成两半,逐步缩小查找范围,直到找到目标元素或确定目标元素不存在。

_20250224204801.jpg

  1. 初始化:设定查找范围的起始点 left 和结束点 right,初始时 left = 0,right = 数组长度 - 1。

  2. 计算中间点:计算中间点 mid = left + (right-left) / 2。

注:因为 left和right都是int类型,为了避免left+right 超出int类型的最大值。此处使用 mid = left + (right-left) / 2 来计算中间索引。

  1. 比较中间元素:

如果中间元素等于目标值,返回中间索引。

如果中间元素大于目标值,将 right 更新为 mid - 1,继续在左半部分查找。

如果中间元素小于目标值,将 left 更新为 mid + 1,继续在右半部分查找。

  1. 重复步骤2和3,直到 left 大于 right,此时目标元素不存在于数组中,返回 -1。
  • 时间复杂度

二分查找的时间复杂度为 O(log n),其中 n 是数组的长度。这是因为每次查找都将查找范围减半,因此算法的效率非常高。

java_34">java实现二分查找

代码如下:

java">/**
 * 二分查找
 */
public class BinarySearchExample {
    /**
     *
     * @param arr 有序数组
     * @param left 左边界
     * @param right 右边界
     * @param value 目标值
     * @return
     */
    public static int binarySearch(int[] arr, int left, int right, int value) {
        while (left <= right) {
            int mid = left + (right-left) / 2;
            if (arr[mid] == value) {
                // 找到目标元素,返回索引
                return mid;
            } else if (arr[mid] < value) {
                // 在右半部分继续查找
                left = mid + 1;
            }  else if (arr[mid] > value)  {
                // 在左半部分继续查找
                right = mid - 1;
            }
        }
        // 目标元素不存在
        return -1;
    }

    public static void main(String[] args) {
        int[] arr = {1, 8, 12, 14, 20, 23, 29};
        int index = binarySearch(arr, 0, arr.length - 1, 20);
        System.out.println(index);
    }

}

适用场景

二分查找适用于以下场景:

  • 有序数组:二分查找要求数组必须是有序的,否则无法保证正确性。

  • 静态数据:如果数据集合不经常变动,二分查找是一个高效的选择。

  • 查找频繁:当需要频繁查找某个元素时,二分查找的时间复杂度为 O(log n),远优于线性查找的 O(n)。

总结

二分查找是一种高效的查找算法,适用于有序数组或列表。它的时间复杂度为 O(log n),在处理大规模数据时表现出色。通过本文的介绍,我们了解了二分查找的基本原理、Java实现、适用场景。希望本文能帮助你更好地理解和应用二分查找算法


http://www.niftyadmin.cn/n/5867115.html

相关文章

《一起打怪兽吧》——自制一款Python小游戏

《一起消灭怪兽吧》——在深夜的屏幕前&#xff0c;你是指引光明的勇者。键盘化作利剑&#xff0c;用方向键在像素战场游走&#xff0c;发射吧&#xff0c;每次击杀都有代码绽放的烟火。这款由Python与Pygame铸就的小游戏&#xff0c;让0与1的世界生长出童真的浪漫。 文章目录…

Open WebUI 是什么

Open WebUI 是什么 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器,如 Ollama 和 OpenAI 兼容的 API,并内置了 RAG 推理引擎,使其成为强大的 AI 部署解决方案。 https://github.com/open-webui/open-webui 🚀 …

Spring Boot + JSqlParser:全面解析数据隔离最佳实践

Spring Boot JSqlParser&#xff1a;全面解析数据隔离最佳实践 在构建多租户系统或需要进行数据权限控制的应用时&#xff0c;数据隔离是一个至关重要的课题。不同租户之间的数据隔离不仅能够确保数据的安全性&#xff0c;还能提高系统的灵活性和可维护性。随着业务的扩展和需…

<tauri><rust><GUI><PLC>基于tauri,编写一个串口485调试助手

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10平台:visual studio code语言:rust、javascript库:tauri2.0概述 本文基…

51单片机-AT24CXX存储器工作原理

1、AT24CXX存储器工作原理 1.1、特点&#xff1a; 与400KHz&#xff0c;I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…

Git-速查

Git 安装 Git 之后&#xff0c;你可以… 配置全局用户信息&#xff08;推荐&#xff09; 全局设置&#xff0c;创建本地仓库时默认分支名称为 main&#xff08;你需要什么名称就该什么名称&#xff09;【推荐配置为 main 】 git config --global init.defaultBranch main全…

[Linux]从零开始的STM32MP157 U-Boot网络命令讲解及相关配置

一、前言 在上一次的STM32MP157的教程中&#xff0c;教大家STM32MP157基础命令的使用&#xff0c;同时也验证了我们STM32MP157U-Boot的部分功能。因为U-Boot的网络配置部分比较复杂&#xff0c;所以在上一次的教程中并没有涉及。那么本次教程&#xff0c;我会为大家详细的讲解U…

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库&#xff08;DataBase&#xff0c;DB&#xff09;简单来说就是数据的集合数据库管理系统&#xff08;Database Management System&#xff0c;DBMS&#xff09;是一种操纵和管理数据库的大型软件&#xff0c;通常用于建立、使用和维护数据库。数据库系统…