返回

二分法:JavaScript版通俗详解,告别复杂

前端

前言

大家好,我是饼干酱,在力扣刷过700+题,虽然是个小前端,但是对算法一直很热爱。总是看到有人说不会二分,也看到过各种总结的文章,写得极其复杂,旧人懵逼,新人落泪。但是就我700+题的经验来说,二分法真的没那么难,只要你能理解它的原理,就能轻松掌握。

二分法的原理

二分法是一种在有序数组中查找特定元素的算法。它的基本思想是:将数组一分为二,然后比较目标元素与中间元素的大小。如果目标元素等于中间元素,则查找成功;如果目标元素小于中间元素,则继续在前半部分数组中查找;如果目标元素大于中间元素,则继续在后半部分数组中查找。

这样,每次比较都会将搜索范围缩小一半,从而大大提高了查找效率。二分法的平均时间复杂度为O(log n),其中n是数组的长度。

二分法的实现

在JavaScript中,可以使用以下步骤来实现二分法:

  1. 首先,将数组排序。
  2. 然后,定义两个变量,分别代表数组的左边界和右边界。
  3. 接下来,进入一个循环,在循环中计算出中间元素的索引。
  4. 比较目标元素与中间元素的大小。
  5. 如果目标元素等于中间元素,则查找成功,返回中间元素的索引。
  6. 如果目标元素小于中间元素,则将右边界更新为中间元素的索引减一。
  7. 如果目标元素大于中间元素,则将左边界更新为中间元素的索引加一。
  8. 重复步骤3-7,直到找到目标元素或左边界大于右边界。

二分法的示例

下面是一个二分法的JavaScript示例,用于在一个有序数组中查找一个特定的元素:

function binarySearch(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;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return -1;
}

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const target = 5;

const result = binarySearch(arr, target);

if (result !== -1) {
  console.log(`找到了目标元素,索引为 ${result}`);
} else {
  console.log("没有找到目标元素");
}

结语

二分法是一种非常高效的算法,在许多场景下都有应用。掌握二分法,可以帮助你解决许多算法问题。希望这篇文章对你的学习有所帮助。