当前位置:首页 > 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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…