数据结构与算法-二分查找
大家好,欢迎回到我们的算法学习系列。今天,我们将探讨一个基本且高效的算法——二分查找。这种算法在处理有序数据时非常有用。
什么是二分查找?
二分查找(Binary Search)是一种在有序数组中查找某个元素的位置的算法。它通过每次将查找范围减半来缩小搜索范围,从而大大提高查找效率。
问题描述
给定一个有序数组和一个目标值,如果目标值在数组中,返回其索引;否则,返回 -1。
示例
- 输入:
nums = [-1,0,3,5,9,12]
,target = 9
输出:4
- 输入:
nums = [-1,0,3,5,9,12]
,target = 2
输出:-1
解决思路
二分查找的基本思想是每次将数组分成两半,逐步缩小搜索范围。具体步骤如下:
- 初始化左右指针:定义两个指针,
left
指向数组的起始位置,right
指向数组的结束位置。 - 计算中间位置:计算中间位置的索引
mid
。 - 比较中间值与目标值:
- 如果中间值等于目标值,则返回
mid
。 - 如果中间值小于目标值,则目标值在右半部分,更新
left
。 - 如果中间值大于目标值,则目标值在左半部分,更新
right
。
- 如果中间值等于目标值,则返回
- 重复步骤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;
}
代码解析
- 初始化指针:
left
指向数组的起始位置,right
指向数组的结束位置。 - 循环查找:
- 计算中间位置
mid
。 - 如果中间值
nums[mid]
等于目标值target
,返回mid
。 - 如果中间值小于目标值,说明目标值在右半部分,更新
left
为mid + 1
。 - 如果中间值大于目标值,说明目标值在左半部分,更新
right
为mid - 1
。
- 计算中间位置
- 返回结果:如果循环结束后仍未找到目标值,返回
-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) 的时间复杂度内高效地查找有序数组中的目标值。这种算法在处理有序数据时非常有用,广泛应用于各种编程问题中。
感谢大家的阅读!如果你有任何问题或建议,欢迎在评论区留言。让我们一起在算法的世界中不断学习和进步!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)