Java算法探秘:二分查找详解

简介: 二分查找是一种高效的查找算法,适用于有序数组。它的时间复杂度为 O(log n),其中 n 是数组的长度。由于每次迭代都将搜索范围减半,因此它比线性查找等简单查找算法更加高效,特别是对于大型有序数组。通过仔细实现和理解二分查找算法,你可以在 Java 中轻松应用它来解决各种查找问题。

当你需要在一个有序数组中查找特定元素时,二分查找是一种高效的算法。它的时间复杂度为 O(log n),相较于线性查找的 O(n),二分查找可以显著提高搜索效率。本文将详细解释什么是二分查找,以及如何在 Java 中实现它。

二分查找简介

二分查找,也称为折半查找,是一种在有序数组中查找目标元素的算法。它的原理是不断将查找范围减半,直到找到目标元素或确定目标元素不存在。二分查找的步骤如下:

  1. 初始化左边界 left 为数组第一个元素的索引,右边界 right 为数组最后一个元素的索引。
  2. 计算中间元素的索引 mid,它等于 (left + right) / 2。
  3. 比较中间元素与目标元素:
  • 如果中间元素等于目标元素,则找到目标,返回中间元素的索引。
  • 如果中间元素大于目标元素,则将右边界更新为 mid - 1,继续在左半边查找。
  • 如果中间元素小于目标元素,则将左边界更新为 mid + 1,继续在右半边查找。
  1. 重复步骤 2 和 3,直到找到目标元素或左边界超过右边界。

Java 实现二分查找

以下是在 Java 中实现二分查找的示例代码:

/**
 * 二分查找
 */
public static int binarySearch(int[] intArr,int key){
   
    int left = 0;
    int right = intArr.length -1;

    while(left <= right){
   
        //计算中间元素的索引
        int mid = (left + right) >>> 1;
        //获取中间元素的值
        int midVal = intArr[mid];
        //比较中间元素和目标元素的值
        //如果中间元素小于目标元素,则将左边界更新为 mid + 1,继续在右半边查找。
        if (midVal < key)
            left = mid + 1;
        //如果中间元素大于目标元素,则将右边界更新为 mid - 1,继续在左半边查找。
        else if (midVal > key)
            right = mid - 1;
        //如果中间元素等于目标元素,则找到目标,返回中间元素的索引。
        else
            return mid;
    }

    //如果循环结束仍未找到目标元素,返回一个负数,表示未找到,通常为-(left + 1)
    return -(left + 1);
}

public static void main(String[] args) {
   

    int[] intArray = new int[]{
   2,4,5,7,9,11,16,23,45,67};

    System.out.println(binarySearch(intArray,5));
    System.out.println(binarySearch(intArray,23));
    System.out.println(binarySearch(intArray,1));
    System.out.println(binarySearch(intArray,20));
    System.out.println(binarySearch(intArray,110));

}

输出结果为:

2
7
-1
-8
-11

上述代码中,binarySearch 方法接受一个有序数组 intArr 和目标元素 key 作为参数,然后使用二分查找算法在数组中查找目标元素的索引。如果找到目标元素,返回它的索引;否则,返回 负数 表示目标元素不存在。

注意事项

二分查找的前提是数组必须是有序的,否则无法正常工作。如果数组不是有序的,需要先对数组进行排序,然后才能使用二分查找算法。

总结

二分查找是一种高效的查找算法,适用于有序数组。它的时间复杂度为 O(log n),其中 n 是数组的长度。由于每次迭代都将搜索范围减半,因此它比线性查找等简单查找算法更加高效,特别是对于大型有序数组。通过仔细实现和理解二分查找算法,你可以在 Java 中轻松应用它来解决各种查找问题。

目录
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
96 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3天前
|
算法 索引
【算法】——二分查找合集
二分查找基础模版和进阶模版,查找元素位置,搜索插入位置,x的平方根,山脉数组的峰顶索引,寻找峰值,点名
|
5天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
19 6
|
2月前
|
Java
在 Java 中实现二分查找法
【10月更文挑战第9天】
38 1
|
2月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
2月前
|
算法 Java
java冒泡排序与二分查找(详解)
java冒泡排序与二分查找(详解)
48 4
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
156 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
93 2
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
2月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
155 0