首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文带你读懂排序算法(六):二分查找算法

一文带你读懂排序算法(六):二分查找算法

作者头像
后台技术汇
发布2022-05-28 12:14:37
发布2022-05-28 12:14:37
1.1K00
代码可运行
举报
文章被收录于专栏:后台技术汇后台技术汇
运行总次数:0
代码可运行

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

使用二分查找有两个必须满足条件:

  1. 必须采用顺序存储结构。
  2. 必须按关键字大小有序排列。

图解二分查找算法

下面我们结合图例解析二分查找的执行流程,在顺序排列的序列中寻找目标值79:

  • 初始化序列:[3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82]
  • 第1次查找:min=0,max=10,mid=(0+10)/2=5,此时a[mid] < 目标值。因此,设置min=mid,校准mid=(min+max)/2=8
  • 第2次查找:min=5,max=10,mid=8,此时a[mid] < 目标值。因此,设置min=mid,校准mid=(min+max)/2=9
  • 第3次查找,此时a[mid] = 目标值,二分查找结束。

算法实现

算法实现如下代码块:

代码语言:javascript
代码运行次数:0
运行
复制
public class BinarySearch {
  public static void main(String[] args) {
    int[] array= new int[]{3, 12, 24, 31, 46, 48, 52, 66, 69, 79, 82};
    int index = binarySearch(array, 0, array.length-1, 79);
    System.out.println("findout target index = " + index);
  }
  /**
   * 二分查找算法(返回该值第一次出现的位置)
   * @param nums      查询数组
   * @param start     开始下标
   * @param end       结束下标
   * @param findValue 要查找的值
   * @return int
   */
  private static int binarySearch(int[] nums, int start, int end, int findValue) {
    if (start <= end) {
      // 中间位置
      int middle = (start + end) / 2;
      // 中间的值
      int middleValue = nums[middle];
      System.out.println("middle="+middle);
      if (findValue == middleValue) {
        // 等于中值直接返回
        return middle;
      } else if (findValue < middleValue) {
        // 小于中值,在中值之前的数据中查找
        return binarySearch(nums, start, middle - 1, findValue);
      } else {
        // 大于中值,在中值之后的数据中查找
        return binarySearch(nums, middle + 1, end, findValue);
      }
    }
    return -1;
  }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
复制
middle=5
middle=8
middle=9
findout target index = 9

算法复杂度计算

时间复杂度:因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:循环递归的次数是log2(n),即查询次数m=log2(n),所以时间复杂度为:log2(n),对数级。

空间复杂度:因为查询过程中,仅仅声明了局部变量存储头指针、尾指针和中间指针,所以空间复杂度是常数级,即O(1)。

—END—

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后台技术汇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 图解二分查找算法
  • 算法实现
  • 算法复杂度计算
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档