小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
算法学习小积累: 二分查找法的实现过程
二分查找法
概念理解
二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找法 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。这里我们先给出二分查找法的第一种写
二分法的实现分析
二分法: 对于有序数列, 才能使用二分查找法 (排序的作用)
理解:中间的是 左边的 < 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))
}