📜  JavaScript中的二进制搜索(1)

📅  最后修改于: 2023-12-03 15:31:47.548000             🧑  作者: Mango

JavaScript中的二分搜索

二分搜索是一种高效的查找算法,也称为二分查找、折半查找,它可以在有序数组中快速查找目标值。在JavaScript中,我们可以通过递归和迭代两种方式实现二分搜索。

递归实现

以下是用递归实现二分搜索的代码片段,其中arr为有序数组,target为目标值,leftright分别表示数组起始和终止位置:

function binarySearchRecursive(arr, target, left = 0, right = arr.length - 1) {
  if (left > right) {
    return -1; // 没找到目标值,返回-1
  }

  const mid = Math.floor((left + right) / 2);

  if (arr[mid] === target) {
    return mid; // 找到目标值,返回下标
  } else if (arr[mid] > target) {
    return binarySearchRecursive(arr, target, left, mid - 1); // 目标在左半边,递归左半边
  } else {
    return binarySearchRecursive(arr, target, mid + 1, right); // 目标在右半边,递归右半边
  }
}

在这个实现中,我们首先判断数组范围是否符合要求,若不符则说明目标值不存在,直接返回-1。然后计算中点位置,如果该位置的值等于目标值,则说明找到了目标值,直接返回该位置。如果中点值大于目标值,则说明目标值在左半边,递归调用左半边的数组进行搜索;反之,递归调用右半边的数组。

迭代实现

以下是用迭代实现二分搜索的代码片段:

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; // 找到目标值,返回下标
    } else if (arr[mid] > target) {
      right = mid - 1; // 目标在左半边,缩小右边界继续搜索
    } else {
      left = mid + 1; // 目标在右半边,缩小左边界继续搜索
    }
  }

  return -1; // 没找到目标值,返回-1
}

在这个实现中,我们用leftright分别表示数组起始和终止位置,之后开始进行循环。每次循环都计算中点位置,如果该位置的值等于目标值,则说明找到了目标值,直接返回该位置。如果中点值大于目标值,则说明目标值在左半边,将右边界缩小为中点位置,继续搜索;反之,将左边界缩小为中点位置+1,继续搜索。如果循环结束了还没找到目标值,说明目标值不存在,直接返回-1。

总结

以上介绍了JavaScript中的二分搜索,该算法的时间复杂度为O(logN),比线性搜索更高效。使用递归和迭代两种方式均可以实现,具体使用哪种方式取决于个人喜好和具体场景。