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;
}
}
}