数据结构与算法-二分查找

数据结构与算法-二分查找

大家好,欢迎回到我们的算法学习系列。今天,我们将探讨一个基本且高效的算法——二分查找。这种算法在处理有序数据时非常有用。

什么是二分查找?

二分查找(Binary Search)是一种在有序数组中查找某个元素的位置的算法。它通过每次将查找范围减半来缩小搜索范围,从而大大提高查找效率。

问题描述

给定一个有序数组和一个目标值,如果目标值在数组中,返回其索引;否则,返回 -1。

示例

  • 输入:nums = [-1,0,3,5,9,12], target = 9
    输出:4
  • 输入:nums = [-1,0,3,5,9,12], target = 2
    输出:-1

解决思路

二分查找的基本思想是每次将数组分成两半,逐步缩小搜索范围。具体步骤如下:

  1. 初始化左右指针:定义两个指针,left 指向数组的起始位置,right 指向数组的结束位置。
  2. 计算中间位置:计算中间位置的索引 mid
  3. 比较中间值与目标值
    • 如果中间值等于目标值,则返回 mid
    • 如果中间值小于目标值,则目标值在右半部分,更新 left
    • 如果中间值大于目标值,则目标值在左半部分,更新 right
  4. 重复步骤2和3:直到找到目标值或搜索范围为空。

实现代码

下面是用JavaScript实现这个算法的代码:

function binarySearch(nums, target) {
  let left = 0;
  let right = nums.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return -1;
}

代码解析

  1. 初始化指针left 指向数组的起始位置,right 指向数组的结束位置。
  2. 循环查找
    • 计算中间位置 mid
    • 如果中间值 nums[mid] 等于目标值 target,返回 mid
    • 如果中间值小于目标值,说明目标值在右半部分,更新 leftmid + 1
    • 如果中间值大于目标值,说明目标值在左半部分,更新 rightmid - 1
  3. 返回结果:如果循环结束后仍未找到目标值,返回 -1

图解

让我们通过图解来理解二分查找的过程:

初始数组:

nums = [-1, 0, 3, 5, 9, 12], target = 9
left = 0, right = 5

第一步:

mid = (0 + 5) / 2 = 2
nums[mid] = 3 < 9
left = mid + 1 = 3

第二步:

mid = (3 + 5) / 2 = 4
nums[mid] = 9 == 9
返回 4

小结

今天,我们介绍了二分查找算法及其实现方法。通过将查找范围逐步减半,二分查找能够在 O(log n) 的时间复杂度内高效地查找有序数组中的目标值。这种算法在处理有序数据时非常有用,广泛应用于各种编程问题中。

感谢大家的阅读!如果你有任何问题或建议,欢迎在评论区留言。让我们一起在算法的世界中不断学习和进步!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端每日三省

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值