二分查找

73 阅读1分钟

二分查找

题目

用 Javascript 实现二分查找(针对有序数组),说明它的时间复杂度

分析

二分查找是一种固定的算法

两种实现思路

  • 递归 - 代码逻辑更加简洁
  • 循环 - 性能更好(就调用一次函数,而递归需要调用很多次函数,创建函数作用域会消耗时间)

时间复杂度 O(logn)

// 二分查找 循环
function binaryFind1(arr = [], target) {
  const length = arr.length;
  if (length === 0) return -1;
  let startIndex = 0;
  let endIndex = length - 1;
  while (startIndex <= endIndex) {
    const midIndex = Math.floor((startIndex + endIndex) / 2);
    const midValue = arr[midIndex];
    if (target < midValue) {
      // 目标值较小,则继续在左侧查找
      endIndex = midIndex - 1;
    } else if (target > midIndex) {
      // 目标值较大,则继续在右侧查找
      startIndex = midIndex + 1;
    } else {
      return midIndex;
    }
  }
  return -1;
}
// 二分查找 递归
function binaryFind2(arr, target, startIndex, endIndex) {
  const length = arr.length;
  if (length === 0) return -1;
  // 开始和结束的范围
  if (startIndex == null) startIndex = 0;
  if (endIndex == null) endIndex = length - 1;
  // 如果 start 和 end 相遇,则结束
  if (startIndex > endIndex) return -1;
  const midIndex = Math.floor((startIndex + endIndex) / 2);
  const midValue = arr[midIndex];
  if (target < midIndex) {
    // 目标值较小,则继续在左侧查找
    return binaryFind2(arr, target, startIndex, midIndex - 1);
  } else if (target > midIndex) {
    // 目标值较大,则继续在右侧查找
    return binaryFind2(arr, target, midIndex + 1, endIndex);
  } else {
    return midIndex;
  }
  return -1;
}