二分查找成长录

149 阅读1分钟

A是一个已排序的数组,x是目标值。 如果找到目标值,返回目标值在数组中的序号。如果没有找到目标值,返回目标值应该被插入的位置

 function bSearch(ary,x){
     let l=0,r=ary.length-1,guess;
     if(x<0){
       return 0
     }
     if(x>ary[ary.length-1]){
        return ary.length
     }
     while(l<=r){
        guess=Math.floor((l+r)/2);
        if(ary[guess]==x) return guess;
        if(guess+1<=ary.length-1){
          if(ary[guess]<x&&ary[guess+1]>x){
            return guess+1
          }
        }
        if(guess-1>=0){
          if(ary[guess]>x&&ary[guess-1]<x){ 
             return guess;
          }
        }
        
        if(ary[guess]<x){
             l=guess+1
        }else if(ary[guess]>x){
             r=guess-1;
        }
     }
  }
  
   let  A=[3,5,7,13,22,25];
   console.log(bSearch(A,30));

function bSearch(ary,x){
     let l=0,r=ary.length-1,guess;
     if(x<0){
       return 0
     }
     if(x>ary[ary.length-1]){
        return ary.length
     }
     while(l<=r){
        guess=Math.floor((l+r)/2);
        if(ary[guess]==x) return guess;
        if(guess+1<=ary.length-1){
          if(ary[guess]<x&&ary[guess+1]>x){
            return guess+1
          }
        }
        if(guess-1>=0){
          if(ary[guess]>x&&ary[guess-1]<x){ 
             return guess;
          }
        }
        
        if(ary[guess]<x){
             l=guess+1
        }else if(ary[guess]>x){
             r=guess-1;
        }
     }
  }
  
   let  A=[3,5,7,13,22,25];
   console.log(bSearch(A,30));



简化版:

function bSearch(ary,x){
  let l=0,r=ary.length-1,guess;
  while(l<=r){
     guess=Math.floor((l+r)/2);
     if(ary[guess]==x) return guess;
     if(ary[guess]<x){
        if(guess==ary.length-1||ary[guess+1]>x){
            return guess+1
        }
        l=guess+1
     }else if(ary[guess]>x){
        if(guess==0||ary[guess-1]<x){
          return guess;
        }
        r=guess-1;
     }
  }
}