有序数组插值查找,js实现

135 阅读1分钟

解析

数组中元素的下标比与他们的值的比是近似的。 目标元素下标减去lo比hi-lo 约等于 目标元素减去第lo个元素比第hi个元素减去第lo个元素。 未知数为目标元素的下标,换算一下将等式的左边只剩下目标元素下标mid,我们可以通过迭代逐步缩小mid的范围

function interpolationSearch(arr,num) {
    let  lo = 0, hi = arr.length-1
    while (lo<=hi){
        let mid = Math.floor(lo + (hi-lo)*(num-arr[lo])/(arr[hi]-arr[lo]))
        if(arr[mid]==num) return mid
        arr[mid]<num?
            lo = mid + 1 :
            hi = mid - 1
    }
    return -1
}