前端面试真题,2周刷完100道。8. 用js 实现二分查找

69 阅读2分钟

二分查找

什么是二分查找

二分查找是在一个有序的数组中查找,查找某个值的索引。比如在一个数组 arr 中 查找 target ,找到了返回 target 在arr 中的索引, 没找到返回 -1.

二分查找的思路

  1. 创建两个变量,一个是数组的开始位置startIndex,一个是数组的结尾位置 endIndex,
  2. 计算出数组的中间位置 minIndex .
  3. 用中间位置的值和target 进行比较, 比如是一个升序的数组,那target 大于 中间值, 就把startIndex 设置为minIndex , minIndex 重新计算赋值,再重复比较。直到 找到target = 中间值。
  4. 如果一直到 startIndex = endIndex 也没有找到相等的值,那就是没找到 返回-1

二分查找的复杂度

由于每次查找到会排除掉数组的一半, 时间复杂度为O(logn)

二分的应用

这种思想应用的非常普遍,在速度上是非常大的优势。 就好比有规则下的排除法。

循环实现二分查找

function binarySearch1 (arr: number[],target: number): number {
  const len = arr.length;
  if (len===0) return -1;
  let startIndex: number = 0;
  let endIndex: number = len - 1;
  while (startIndex < endIndex) {
    const minIndex = Math.floor((startIndex+endIndex)/2)
    const minValue = arr[minIndex]
    if (target < minValue) {
      endIndex = minIndex - 1
    } else if (target > minValue) {
      startIndex = minIndex + 1
    } else {
      return minIndex
    }
  }
  return -1
}

递归实现二分查找

function binarySearch2 (arr: number[], target: number, startIndex?: number, endIndex?: number): number {
  const len = arr.length;
  if (len===0) return -1;
  if (!startIndex) {
    startIndex = 0
  }
  if (!endIndex) {
    endIndex = len - 1
  }
  const minIndex = Math.floor((startIndex+endIndex)/2)
  const minValue = arr [minIndex]
  if (target > minValue) {
    return binarySearch2(arr, target, minIndex + 1, endIndex)
  }else if (target < minValue) {
    return binarySearch2(arr, target, startIndex, endIndex - 1)
  }else {
    return minIndex
  }
}

小结

  1. 循环和递归的时间复杂度都是O(logn)
  2. 在有序的情况下,基本上都会用到二分
  3. 因为每次调用函数都会有额外的开销,所以 循环还是比递归更快些。(较真)

2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注:奋斗的刚子

欢迎访问我的小程序,惊喜不断

xcxm.jpg