• 数据结构和算法之二分法查找


    二分法查找,也称作二分查找折半查找,是一种在有序数组中快速查找特定元素的算法。它采用分治法思想,通过将问题划分为规模更小的子问题,并且通过对子问题的查找来解决原问题。

    二分法查找的思路是不断地将数组一分为二,然后判断目标值在哪一部分,进而在该部分继续进行二分查找。具体步骤如下:

    1. 首先,设置左边界 left 为0,右边界 right 为数组的长度减1。
    2. 然后,计算中间值 mid 为左边界与右边界的平均值,并取整。
    3. 接着,比较中间值 arr[mid] 与目标值 target 的大小。如果相等,则返回索引 mid
    4. 如果 arr[mid] 大于 target,说明目标值在左半部分,将右边界 right 更新为 mid-1
    5. 如果 arr[mid] 小于 target,说明目标值在右半部分,将左边界 left 更新为 mid+1
    6. 重复步骤2至5,直到左边界大于右边界,表示数组中无目标值,返回-1。
    开始
    初始化左指针l和右指针r
    判断l是否大于r
    找到目标值
    判断中间值是否等于目标值
    找到目标值
    判断中间值是否大于目标值
    在左半部分继续查找
    在右半部分继续查找

    说明:

    • 开始时,初始化左指针l指向数组的首元素,右指针r指向数组的尾元素。
    • 判断左指针l是否大于右指针r,如果是则表示没有找到目标值,结束查找。
    • 每次都取左指针l和右指针r中间的元素作为中间值。
    • 判断中间值是否等于目标值,如果是则表示找到目标值,结束查找。
    • 如果中间值大于目标值,说明目标值在左半部分,更新右指针r为中间值的前一个位置,继续查找。
    • 如果中间值小于目标值,说明目标值在右半部分,更新左指针l为中间值的后一个位置,继续查找。
    • 继续进行以上步骤,直到找到目标值或者确定没有目标值。

    示例代码:

    function binarySearch(arr, target) {
       let left = 0; // 定义左边界指针为数组的起始位置
       let right = arr.length - 1; // 定义右边界指针为数组的末尾位置
    
       while (left <= right) { // 当左边界指针小于等于右边界指针时执行循环
         let mid = Math.floor((left + right) / 2); // 计算中间元素的位置,向下取整
    
         if (arr[mid] === target) { // 如果中间元素等于目标值
           return mid; // 返回中间元素的位置
         } else if (arr[mid] < target) { // 如果中间元素小于目标值
           left = mid + 1; // 移动左边界指针到中间元素的下一个位置
         } else { // 如果中间元素大于目标值
           right = mid - 1; // 移动右边界指针到中间元素的前一个位置
         }
       }
    
       return -1; // 如果循环结束仍未找到目标值,则返回-1
    }
    
    // 示例使用
    let arr = [1, 3, 5, 7, 9];
    let target = 5;
    
    let result = binarySearch(arr, target);
    console.log(result); // 输出 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在上面的示例中,提供了一个有序数组 arr 和目标值 target,然后调用 binarySearch 函数进行二分查找。最后输出的结果为目标值在数组中的索引,如果不存在则返回-1。

    左边界指针右边界指针中间元素位置中间元素值目标值结果
    042552
  • 相关阅读:
    可替代allegroA3909的国产芯片GC3909的数据分析
    Lite-Mono(CVPR2023)论文解读
    TS的类型规则 类型排名
    数据库等值查询与统计信息
    微软正式发布:.NET Aspire 云原生开发框架
    星卫士&陈卫俊表示要用心打造做真正好用、良心的健康手表
    pytorch在有限的资源下部署大语言模型(以ChatGLM-6B为例)
    路由与交换技术-17-生成树协议配置
    FT2004(D2000)开发实战之移植OpenCV-3.4.16
    Autosar模块介绍:内存模块简介
  • 原文地址:https://blog.csdn.net/jieyucx/article/details/132739636