精确搜索
function search(d, t) {let l = 0, r = d.length;while (l < r) {let m = ((r - l) >>> 1) + l;if (d[m] === t) {return m;} else if (d[m] > t) {r = m;} else if (d[m] < t) {l = m + 1;}}return -1;}
左边界搜索
function left_search(d, t) {let l = 0, r = d.length;while (l < r) {let m = ((r - l) >>> 1) + l;if (d[m] === t) {r = m;} else if (d[m] > t) {r = m;} else if (d[m] < t) {l = m + 1;}}return l;}
右边界搜索
function left_search(d, t) {
  let l = 0, r = d.length;
  while (l < r) {
    let m = ((r - l) >>> 1) + l;
    if (d[m] === t) {
      l = m + 1;
    } else if (d[m] > t) {
      r = m;
    } else if (d[m] < t) {
      l = m + 1;
    }
  }
  return l;
}
三个的核心差别在与 === 条件时的后继处理差异。
| 精确搜索 | return m; | 找到目标对象,直接返回。 | 
|---|---|---|
| 左边界搜索 | r = m; | 找左边界,那么当前这个可能是右边界,所以向左搜索。 | 
| 右边界搜索 | l = m + 1; | 找右边界,那么当前这个可能是左边界,所以向右搜索。 | 
PS:建议不要简写合并条件,不然,三种情况的的差异还要记忆条件组合。
