原文为向量的二分查找,js没向量,用数组实现
伪代码
循环lo<hi
mid向下取整
如果查找目标小于arr[mid],hi=mid
否则lo=mid+1
循环终止后返回--lo
注意:这种方式之所以返回--lo,是因为当目标等于arr[mid]的情况会被lo=mid+1这个操作将其排到lo左边去,不在[lo,hi)区间范围内。
代码
function binarySearch(arr,num) {
let lo = 0,hi = arr.length
while (lo<hi){
let mid = Math.floor((hi-lo)/2)+lo
(num<arr[mid])?
hi=mid : lo=mid+1
}
return {
index:lo-1,
value: arr[lo-1]
}
}
console.log(binarySearch([1,2,3,4,5,5,6,8],5))
解释向下取整与lo=mid+1
取整是必须的,当为单数时,就会必然用到。
然而取整设计到一个问题,当处于临界值时,向上向下取整会决定改变的是lo还是hi,所以我们改变他们的值时也需要让其处于临界值时变化。
比如:lo=4,hi=5时,向下取整mid就等于5,我们要找的元素小于arr[4],hi=mid=4会造成死循环,所以需要lo=mid+1。