• 写一个二分查找函数bsearch,和之前学习的二分查找函数有一定的变化。
    1. function bsearch(A, x) {
    2. /// TODO
    3. }

    A是一个已排序的数组,x是目标值。

    1. 如果找到目标值,返回目标值在数组中的序号。

    2. 如果没有找到目标值,返回目标值应该被插入的位置

    比如数组: A=3,5,7,13,22,25

    bsearch(A,5) // 1
    bsearch(A,13) // 3
    bsearch(A,4) // 1
    bsearch(-1) // 0
    bsearch(-10000) // 0
    bsearch(30) // 6
    
    • 参考答案:
    function bsearch(A, x){
      let l = 0,
          r = A.length - 1,
          guess
    
      while(l<=r) {
        guess = Math.floor( (l + r) / 2 )
        if(A[guess] === x) return guess
        if(A[guess] > x) {
          if(guess === 0 || A[guess - 1] < x) {
            return guess
          }
          r = guess - 1
        } else {
          if(guess === A.length - 1 || A[guess + 1] > x) {
            return guess + 1
          }
          l = guess + 1
        }
      }
    }