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

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

_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实现二分查找

代码如下:

/**
 * 二分查找
 */
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实现、适用场景。希望本文能帮助你更好地理解和应用二分查找算法。

相关文章:

  • 一.Vue中的条件渲染
  • vue 修改el-tree高亮样式
  • Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南
  • 一周热点:Replit-用于下单的移动应用程序
  • 【Pandas】pandas Series where
  • 欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)
  • 从图片生成3维场景--NERF原理解析及加速版HashNeRF-pytorch代码实现
  • (九)Mapbox GL JS 中 Marker 图层的使用详解
  • 学习笔记04——JMM内存模型
  • 在Spring Boot+Vue前后端分离的项目中使用JWT实现基本的权限校验
  • 数据安全_笔记系列01:数据分类分级与敏感数据识别详解
  • 内容中台智能推荐系统的模型演进
  • CSS中padding和margin属性的使用
  • Flutter系列教程之(2)——Dart语言快速入门
  • docker-Compose工具使用
  • Go入门之接口
  • VMware虚拟机17.5.2版本下载与安装(详细图文教程包含安装包)
  • C语言:字符函数和字符串函数
  • 【Swift 算法实战】利用 KMP 算法高效求解最短回文串
  • scp工具
  • 一女游客在稻城亚丁景区因高反去世,急救两个多小时未能恢复生命体征
  • 光速晋级!2025年多哈世乒赛孙颖莎4比0战胜对手
  • 有关“普泽会”,俄官方表示:有可能
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 以军称已开始在加沙的新一轮大规模攻势
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动