二分查找法

二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。算法思想是不断的缩小查找范围,步骤如下:

1️⃣ 确定基准

  • 选定数组的中间元素(基准值)。
  • 如果数组大小为偶数,通常选择中间的 右侧元素(也可以选择左侧元素,但不影响算法效果)。

2️⃣ 分割数组

  • 将数组分成两半,基准元素作为分割点。
  • 对比目标值与基准值:

3️⃣ 判断目标位置

  • 如果目标值 小于基准值,则目标值一定在数组的 左半部分,下一轮查找范围是左半部分。
  • 如果目标值 大于基准值,则目标值一定在数组的 右半部分,下一轮查找范围是右半部分。

4️⃣ 重复步骤

  • 在新的查找范围内,重新计算中间元素,并继续比较,逐步缩小查找范围,直到找到目标值或范围为空(即left > right)。

相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快,对比图如下:

复制代码
function binarySearch(arr,start,end,target){
    if(start > end){
        return -1;
    }
    //中间值在整个数组中的位置 = 开始位置 + 当前分区的中间位置
    let mid = start + Math.floor((end-start)/2)
    if(arr[mid] === target){
        return mid;
    }else if(arr[mid] < target ){
        //右侧查找
        return binarySearch(arr,mid + 1,end,target)
    }else{
        //左侧查找
        return binarySearch(arr,start,mid - 1,target)
    }
} 
复制代码

 

 

 

 

如果数组中存在重复项,而我们需要找出第一个匹配项或最后一个匹配项,实现代码如下:

复制代码
function binarySearch(arr, l, r, target, findBoundary = 'first') {
    if (start > end) {
        return -1;  // 未找到目标元素
    }
    let mid = start + Math.floor((end - start) / 2);
    //找到时,进一步查找(第1个还是最后一个)
    if (arr[mid] === target) {
        if (findBoundary === 'first') {
            // 如果是查找第1个,继续向左查找,直到找到第一个匹配项
            if (mid === 0 || arr[mid - 1] !== target) {
                return mid;  // 找到第一个匹配项
            }
            return binarySearch(arr, start, mid - 1, target, findBoundary);
        } else if (findBoundary === 'last') {
            // 如果是查找最后一个,继续向右查找,直到找到最后一个匹配项
            if (mid === end || arr[mid + 1] !== target) {
                return mid;  // 找到最后一个匹配项
            }
            return binarySearch(arr, mid + 1, end, target, findBoundary);
        }
    } else if (arr[mid] < target) {
        return binarySearch(arr, mid + 1, end, target, findBoundary); // 向右查找
    } else {
        return binarySearch(arr, start, mid - 1, target, findBoundary); // 向左查找
    }
}
复制代码

 

 

 

  

posted @   我是格鲁特  阅读(571)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示