实现一个二分查找

33 阅读1分钟

/**
 * @param { array<number> } A 要查找的数组
 * @param { number } x 目标值
 */
function handle(A, x) {

    // 左边界
    let leftIndex = 0
    // 右边界
    let rightIndex = A.length - 1
    // 猜测的位置
    let guess

    // 给一个结束条件
    while ( leftIndex <= rightIndex ) {
        // 取中间值
        guess = Math.floor((leftIndex+rightIndex)/2)

        // 循环不变式
        // guess等于leftIndex和rightIndex中间文职

        if ( A[ guess ] === x  ) return guess
        if /* A[ guess ] 大于 x 代表X在左边 */ (  A[ guess ] > x ) {
            rightIndex = guess - 1
        }/* A[ guess ] 小于 x 代表X在右边 */  else if ( A[ guess ] < x ) {
            leftIndex = guess + 1
        }
        
    }

    return A[ guess ] ? guess : -1
}



const arr = [0,2,4,6,8,95,422,3423, 9999]
console.log(handle(arr, 1)) // -1
console.log(handle(arr, 2)) //  
console.log(handle(arr, 9999)) //  8