图解Java经典算法折半查找的原理与实现

 更新时间:2022年09月10日 09:45:33   作者:Binaire-沐辰  
折半查找法也叫做⼆分查找,顾名思义就是把数据分成两半,再判断所查找的key在哪⼀半中,再重复上述步骤知道找到⽬标key,下面这篇文章主要介绍了图解Java经典算法折半查找的原理与实现

二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,可以在数据规模的对数时间复杂度内完成查找。是一种在有序数组中查找某一特定元素的搜索算法。

算法思路

以升序数列为例,比较目标元素与数列中间位置的元素的大小,如果目标元素比中间位置的元素大,则继续在数列的后半部分中进行二分查找;如果目标元素比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。每次比较的数列长度都会是之前数列的一半,直到找到相等元素的位置或者最终没有找到目标元素。

图解

给定一个有序的升序排列的数组 nums=[-1,0,2,5,8,12,18,38,43,46]

然后在该数组中找到目标值 target = 12。

图解如下:

力扣原题

传送门

题目描述:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

解题思路:

根据题意得出该数组为有序数组,这也是使用二分查找的前提条件。

  • 定义两个指针分别指向数组的首尾两个元素;
  • 找到数组的中间值mid;
  • 如果nums[mid] < target,则 target 位于数组的后半部分,反之nums[mid] > target在前半部分;
  • 重复上一步操作,直到nums[mid] = target,说明找到target,返回下标即可。

Java代码实现:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0,right = nums.length - 1;
        while(left <= right) { // 循环条件
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;  // 找不到则返回-1
    }
}

复杂度分析:

  • 时间复杂度:O(logn),其中 n 是数组的长度。
  • 空间复杂度:O(1)。

到此这篇关于图解Java经典算法折半查找的原理与实现的文章就介绍到这了,更多相关Java折半查找内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA集成DeepSeek的详细教程(保姆级教程)

    IDEA集成DeepSeek的详细教程(保姆级教程)

    DeepSeek作为一款强大的代码搜索和分析工具,能够帮助开发者快速定位代码、理解项目结构以及优化代码质量,本文将详细介绍如何在IntelliJ IDEA中集成DeepSeek,并展示如何利用它来提升开发效率,感兴趣的朋友一起看看吧
    2025-02-02
  • 将java程序打成jar包在cmd命令行下执行的方法

    将java程序打成jar包在cmd命令行下执行的方法

    这篇文章主要给大家介绍了关于将java程序打成jar包在cmd命令行下执行的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • SpringBoot视图解析实现原理深入分析

    SpringBoot视图解析实现原理深入分析

    视图解析其实就是SpringBoot某一个controller的方法执行完成之后,它是跳转到那个页面。由于我们springboot项目默认打包为jar包,是形成压缩包的形式,而jsp又不支持压缩,所以我们SpringBoot不知JSP的,需要引入第三方模板引擎才可以处理
    2022-10-10
  • Java使用Redis的方法实例分析

    Java使用Redis的方法实例分析

    这篇文章主要介绍了Java使用Redis的方法,接合实例形式分析了相关redis驱动包安装、java连接redis服务器、数据存储、读取等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • 携程Apollo(阿波罗)安装部署以及java整合实现

    携程Apollo(阿波罗)安装部署以及java整合实现

    这篇文章主要介绍了携程Apollo(阿波罗)安装部署以及java整合实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java中的functor实现

    Java中的functor实现

    Java中的functor实现...
    2006-12-12
  • Java中文件的操作与输入输出流举例详解

    Java中文件的操作与输入输出流举例详解

    Java语言的输入输出功能是十分强大而灵活的,下面这篇文章主要给大家介绍了关于Java中文件的操作与输入输出流的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • SpringBoot自定义配置项过程

    SpringBoot自定义配置项过程

    在SpringBoot项目中,通过在application.properties文件中添加配置项,然后使用@ConfigurationProperties注解将这些配置项与实体Bean进行绑定,可以实现配置项与实体类字段的自动关联,进而方便地读取配置文件中的数据,这种方法不仅简化了配置管理
    2024-11-11
  • Java三目运算符用法举例

    Java三目运算符用法举例

    三目运算符是我们经常在代码中使用的,这篇文章主要给大家介绍了关于Java三目运算符用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spring Boot security 默认拦截静态资源的解决方法

    Spring Boot security 默认拦截静态资源的解决方法

    这篇文章主要介绍了Spring Boot security 默认拦截静态资源,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论