二分搜索
实现思路
- 从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束
- 如果目标值大于或者小于中间元素,则在大于或小于中间元素的那一半数组中搜索
代码实现
// arr 要有序哦
const binarySearch = (arr, target) => {
let lo = 0
let hi = arr.length - 1
while(lo <= hi) {
const mid = (lo + hi) >>> 1
const pivot = arr[mid]
if (pivot < target) {
lo = mid + 1
} else if(pivot > target) {
hi = mid - 1
} else {
return mid
}
}
return -1
}
复杂度分析
- 时间复杂度:O(logN),每次比较都缩小一半搜索范围
- 空间复杂度:O(1),只额外存储 3 个变量