使用场景
在有序数组中查找目标元素
js
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const target = 2
console.log(binarySearch1(arr, target))
console.log(binarySearch2(arr, target))
循环实现
js
function binarySearch1(arr, target) {
const length = arr.length
if (length === 0) return -1
let startIndex = 0 // 开始位置
let endIndex = length - 1 // 结束位置
while (startIndex <= endIndex) {
const midIndex = Math.floor((startIndex + endIndex) / 2) // 中间位置
const midValue = arr[midIndex]
if (target < midValue) {
// 目标值较小,则继续在左侧查找
endIndex = midIndex - 1
} else if (target > midValue) {
// 目标值较大,则继续在右侧查找
startIndex = midIndex + 1
} else {
// 相等,则返回
return midIndex
}
}
return -1 // 未找到
}
递归实现
js
function binarySearch2(arr, target, startIndex, endIndex) {
const length = arr.length
if (length === 0) return -1
// 开始和结束的范围
if (startIndex == null) startIndex = 0
if (endIndex == null) endIndex = length - 1
// 开始和结束相遇,则结束
if (startIndex === endIndex) return -1
// 中间位置
const midIndex = Math.floor((startIndex + endIndex) / 2)
const midValue = arr[midIndex]
if (target < midValue) {
// 目标值较小,则从左侧寻找
return binarySearch2(arr, target, startIndex, midIndex - 1)
} else if (target > midValue) {
// 目标值较大,则从右侧查找
return binarySearch2(arr, target, midIndex + 1, endIndex)
} else {
// 相等,则返回
return midIndex
}
}