青青草原我最狂,谁让我是懒大王
二分查找的原理
二分查找的核心思想是将已排序的数组一分为二,通过比较目标元素与数组中间元素的大小关系,将搜索范围缩小一半。具体步骤如下:
-
初始化左边标识
left为数组起始位置,右边标识right为数组末尾位置。 -
计算中间位置
mid,即(left + right) / 2的整数部分。 -
比较目标元素与
arr[mid]的大小关系:- 如果目标元素等于
arr[mid],则找到目标元素,搜索结束。 - 如果目标元素小于
arr[mid],则目标元素位于数组左半部分,更新right = mid - 1。 - 如果目标元素大于
arr[mid],则目标元素位于数组右半部分,更新left = mid + 1。
- 如果目标元素等于
-
重复执行步骤 2 和步骤 3,直到找到目标元素或搜索范围为空。
示例代码
// 二分查找:
//1 .重要的点如果使用二分查找数组必须是有序的
//2. 定义一个数组 比如我们要找10
let arr = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
// 初始化左边标识
let left = 0
// 初始化右边标识
let right = arr.length - 1
// 通过arr[mid]就可以找到是否大于要找的数还是小于要找的数
// 循环体
while (left <= right) {
//计算中间位置
let mid = Math.floor((left + right) / 2)
if (arr[mid] == 10) {
console.log("目标元素 10 找到,索引为:" + mid); break;
} else {
if (arr[mid] > 10) { //如果是大于要找的就// 更新右边标识
right = mid - 1
} else { //如果小于要找的就更新左边标识
left = mid + 1
}
}
}
// 循环体结束
在上述示例代码中,我们以有序数组 arr 为例进行二分查找。首先,我们定义了左边标识 left 和右边标识 right,然后计算初始的中间位置 mid。通过一个循环体,在每次迭代中,根据中间位置 mid 和目标元素与 arr[mid] 的比较结果,更新左边标识或右边标识,不断缩小搜索范围。当找到目标元素时,跳出循环体,搜索结束。
需要注意的是,二分查找算法的前提是数组必须是有序的,才能保证正确性和效率。如果数组无序,应先进行排序操作。
总结
二分查找算法是一种高效的搜索算法,适用于已排序的数组。通过将搜索范围一分为二,每次迭代都能将搜索范围减半,快速定位目标元素。它的时间复杂度为 O(log n),空间复杂度为 O(1)。二分查找算法在很多场景中都有广泛的应用,例如在查找算法、搜索算法和排序算法中。
希望通过本文的介绍,您对二分查找算法有了更深入的理解。如果您有任何疑问或需要进一步的讨论,请在评论区留言,我将尽力为您解答。谢谢阅读!