算法学习小积累: 二分查找法的实现

196 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

算法学习小积累: 二分查找法的实现过程

二分查找法

概念理解

二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

二分查找法 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。这里我们先给出二分查找法的第一种写

二分法的实现分析

二分法: 对于有序数列, 才能使用二分查找法 (排序的作用)

理解:中间的是 左边的 < v 右边的 > v 然后在一遍继续查找 target, 范围逐渐缩小

function binarySearh(arr, n, target) {
  let l = 0,
    r = n - 1 // 在 [l...r] 的范围里查找 target

  while (l <= r) {
    // 当 l === r 时, 区间 [l...r] 依然是有效的, 有一个元素的
    let mid = (l + r) / 2
    if (arr[mid] === target) {
      return mid
    }
    if (target > arr[mid]) {
      l = mid + 1 // 此时 target 应该在 [mid+1...r] 中
    } else {
      r = mid - 1 // 此时 target zai  [l...mid-1] 中
    }

    return -1
  }
}

功能函数: // 测试 util

// 测试 util

// 生成 n个元素的 有序数组
function generateOrderedArray(n) {
  let arr = []
  for (let i = 0; i < n; i++) {
    arr[i] = i
  }
  return arr
}

// 测试函数
function main() {
  let n = 1000000
  let data = generateOrderedArray(n)

  let start_time = Date.now()
  for (let i = 0; i < n; i++) {
    if (i !== binarySearch(data, n, i)) {
      console.log(i == binarySearch(data, n, i))
      return
    }
  }
  let end_time = Date.now()

  console.log('binarySearch test complete', (countTime = end_time - start_time))
}