二分查找,返回不大于目标元素的最大的元素,js实现

256 阅读1分钟

原文为向量的二分查找,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