当前位置:首页 > JavaScript

js实现二分查找

2026-03-01 07:26:39JavaScript

二分查找的原理

二分查找是一种在有序数组中查找特定元素的算法。通过每次将搜索区间减半,快速定位目标值的位置。时间复杂度为O(log n),远优于线性搜索的O(n)。

递归实现

递归方式通过不断缩小搜索范围实现二分查找。需要定义左右边界作为参数,基准条件为左边界超过右边界。

function binarySearchRecursive(arr, target, left = 0, right = arr.length - 1) {
  if (left > right) return -1;

  const mid = Math.floor((left + right) / 2);
  if (arr[mid] === target) return mid;

  return arr[mid] > target 
    ? binarySearchRecursive(arr, target, left, mid - 1)
    : binarySearchRecursive(arr, target, mid + 1, right);
}

迭代实现

迭代版本通过while循环调整左右指针位置,避免递归调用带来的栈开销。更适用于大规模数据。

function binarySearchIterative(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;

    arr[mid] > target 
      ? right = mid - 1
      : left = mid + 1;
  }
  return -1;
}

边界条件处理

需特别注意数组为空、目标值超出范围等情况。以下代码添加了前置校验:

function binarySearchWithCheck(arr, target) {
  if (!arr.length || target < arr[0] || target > arr[arr.length - 1]) {
    return -1;
  }
  // 后续使用迭代或递归实现
}

变体应用

查找第一个匹配项时,需要在找到目标值后继续向左搜索:

js实现二分查找

function findFirstOccurrence(arr, target) {
  let left = 0;
  let right = arr.length - 1;
  let result = -1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] >= target) {
      if (arr[mid] === target) result = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return result;
}

性能注意事项

使用位运算计算中点可提升性能: const mid = (left + right) >>> 1 等效于 Math.floor((left + right) / 2),但避免浮点数转换。

标签: js
分享给朋友:

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…