懒洋洋都会二分查找了,你还不会吗???

1,013 阅读2分钟

青青草原我最狂,谁让我是懒大王

二分查找的原理

二分查找的核心思想是将已排序的数组一分为二,通过比较目标元素与数组中间元素的大小关系,将搜索范围缩小一半。具体步骤如下:

  1. 初始化左边标识 left 为数组起始位置,右边标识 right 为数组末尾位置。

  2. 计算中间位置 mid,即 (left + right) / 2 的整数部分。

  3. 比较目标元素与 arr[mid] 的大小关系:

    • 如果目标元素等于 arr[mid],则找到目标元素,搜索结束。
    • 如果目标元素小于 arr[mid],则目标元素位于数组左半部分,更新 right = mid - 1
    • 如果目标元素大于 arr[mid],则目标元素位于数组右半部分,更新 left = mid + 1
  4. 重复执行步骤 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)。二分查找算法在很多场景中都有广泛的应用,例如在查找算法、搜索算法和排序算法中。

希望通过本文的介绍,您对二分查找算法有了更深入的理解。如果您有任何疑问或需要进一步的讨论,请在评论区留言,我将尽力为您解答。谢谢阅读!