js二分算法

492 阅读1分钟

1 - 二分查找算法

① 二分查找的数组是有序的

② 二分查找是从数组中间开始查找,如果找到,则结束查找并返回其在数组中的下标。否则将数组中间值(midValue)和要找的值(findValue)进行比较,如果 findValue > midValue , 则将数组中 midValue 右侧的所有值再次一分为二,从中间开始查找,以此递归。反之如果 findValue < midValue ,则将midValue左侧的所有值一分为二进行递归查找。若递归完成后未找到,则返回-1。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

// 当找到值时,返回其在数组中的下标,找不到返回 -1
function searchValue(arr = [], findValue, left = 0, right = arr.length - 1) {
    // left > right 时还未找到findValue,则 findValue 不存在数组中
    if (left > right) {
        return -1
    }
    const mid = parseInt((left + right) / 2)
    if (findValue > arr[mid]) {
        // 要找的值大于中间值,则向右递归
        return searchValue(arr, findValue, mid + 1, right) // 注意需要return
    } else if (findValue < arr[mid]) {
        // 要找的值小于中间值,则向左递归
        return searchValue(arr, findValue, left, mid - 1) // 注意需要return
    } else {
        // 要找的值等于中间值,返回在数组中的下标
        return mid
    }
}

console.info(searchValue(arr, 10))  // 9

2 - 二分查找算法时间复杂度

二分查找的时间复杂度为 O(log2n)

  • Log2n 是数学中的对数,是以2为底n的对数为多少,也就是2的多少次方是n
  • O(log2n) 表示算法的时间复杂度,用的是二分法的思想,比方将一根线一直对折,直到一个点为止
  • 时间复杂度指的并非具体时间,而是操作数的增速