二分法搜索范围

//二分法搜索范围,返回 [start,end] 或者 index
function findScope(str,hasSortArr,callback) {
  var lm,rm;
  var l=0,r=hasSortArr.length;
  var has=false;
  while(l<r){
    const m=(l+r)>>1;
    //比较下坐标大小
    const dis=callback(str,hasSortArr[m])
    if(dis>0){
      l=Math.max(m,l+1)
    }else if(dis<0){
      r=Math.min(m,r-1)
    }else{
      lm=l;
      rm=r;
      l=r=m
      has=true;
    }
  }
  if(has){
    while (lm<l){
      const m=(l+lm)>>1;
      //比较下坐标大小
      const dis=callback(str,hasSortArr[m])
      if(dis>0){
        lm=Math.max(m,lm+1)
      }else{
        l = Math.min(m, l - 1)
      }
    }
    while (rm>r){
      const m=(r+rm)>>1;
      //比较下坐标大小
      const dis=callback(str,hasSortArr[m])
      if(dis<0){
        rm=Math.min(m,rm-1)
      }else {
        r = Math.max(m, r + 1)
      }
    }
    return [l,r];
  }
  return l
}

const index=findScope(10,[1,3,4,4,4,5],function (p1,p2) {
    return p1-p2
})
console.log(index)

  

posted @ 2020-09-21 23:41  无工时代  阅读(193)  评论(0编辑  收藏  举报