当前位置:首页 > 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;
  }
  // 后续使用迭代或递归实现
}

变体应用

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

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实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…