实现:
- 在数组中找出目标值并且返回索引下标
- 没有则返回-1
使用二分查找的前提:
- 数组为有序数组
- 数组元素不能有重复项
需要注意的点:
- 边界判断两种条件
- left < right
- left <= right
- 以上两种情况right的取值是不一样的
const arr = [1,2,3,4,5,6,7,8,9,10]
function splitSearch(arr, num) {
let left = 0
let right = arr.length // 使用 left < right 作为循环退出条件, 必须以arr.length作为right的初始值, 否则查找10会返回-1
while(left < right) {
let midIndex = Math.floor((left + right ) / 2)
let midValue = arr[midIndex]
if (num < midValue) {
right = midIndex
} else if (num > midValue) {
left = midIndex + 1 // 为什么是midIndex + 1? 因为在第一次比较的时候已经使用num跟midValue比较过一次了, 如果num === midValue会直接返回索引退出循环, 正因为如此, 因此下一次比较就应该从minIndex + 1的位置进行计算了.
} else {
return midIndex
}
}
return -1
}
const res = splitSearch(arr, 7)
console.log(res)