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

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

什么是二分查找?

二分查找(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) 的时间复杂度内高效地查找有序数组中的目标值。这种算法在处理有序数据时非常有用,广泛应用于各种编程问题中。

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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。