《JavaScript算法》二分查找

76 阅读2分钟

二分查找是一种在有序数组中查找指定元素的算法。基本思想是:每次比较数组中间的元素,若中间元素正好是要查找的元素,则查找成功;否则,根据中间元素与要查找的元素的大小关系确定新的查找范围。

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;              // 返回该位置
        }

        if (arr[mid] < target) {     // 如果中间位置的元素小于目标元素
            left = mid + 1;          // 将左边界设置为中间位置的右侧
        } else {
            right = mid - 1;         // 将右边界设置为中间位置的左侧
        }
    }

    return -1;   // 如果没有找到目标元素,返回 -1
}

console.log(binarySearch([1, 2, 3, 4, 5, 6, 7, 8, 9], 5));  // 输出 4(表示数字 5 在数组中的位置)

常见的二分查找题型:

  1. 基础二分查找:如上述代码示例,简单地在有序数组中查找元素。
  2. 查找第一个或最后一个指定元素:在有序数组中查找元素,并返回第一个或最后一个匹配元素的位置。
  3. 查找第一个大于等于或小于等于指定元素的位置
  4. 有旋转的有序数组查找:例如,一个原本增序的数组被旋转后变成了 [4,5,6,7,0,1,2],在其中查找一个元素。
  5. 在矩阵中的二分查找:例如,一个每行每列都增序的矩阵,查找其中的一个元素。
  6. 浮点数二分查找:例如,求函数的根或解方程的解。

总的来说,当你遇到一个问题,其中涉及有序的数据结构或可以通过某种方法将其变为有序,并且需要高效地查找或决策,你可以考虑使用二分查找来解决。