递归查找
function erfen_digui(arr, val, left = 0, right = arr.length - 1) {if (left > right) {return -1;}
let cent = Math.floor((right + left) / 2);
if (arr[cent] === val) {return ` 最终查找后果下标为 ${cent}`;
} else if (arr[cent] > val) {right = cent - 1;} else {left = cent + 1;}
return erfen_digui(arr, val, left, right);
}
非递归形式
function erfen_feidigui(arr, val) {
let left = 0,
right = arr.length - 1;
while (left <= right) {let cent = left + Math.floor((right - left) / 2);
if (arr[cent] === val) {return ` 最终查找后果下标为 ${cent}`;
} else if (arr[cent] > val) {right = cent - 1;} else {left = cent + 1;}
}
return -1;
}
定位左边界(查找第一个元素)
function erfen_digui(arr, val, left = 0, right = arr.length - 1) {if (left > right) {return -1;}
let cent = Math.floor((right + left) / 2);
if (arr[cent] === val) {
/**************** 改变点 ********************/
if (arr[cent - 1] === val) {right = cent - 1;} else {return ` 最终查找后果下标为 ${cent}`;
}
/*****************************************/
} else if (arr[cent] > val) {right = cent - 1;} else {left = cent + 1;}
return erfen_digui(arr, val, left, right);
}
二分查找右边界(查找最初一个元素)
function erfen_digui(arr, val, left = 0, right = arr.length - 1) {if (left > right) {return -1;}
let cent = Math.floor((right + left) / 2);
if (arr[cent] === val) {
/**************** 改变点 ********************/
if (arr[cent + 1] === val) {left = cent + 1;} else {return ` 最终查找后果下标为 ${cent}`;
}
/*****************************************/
} else if (arr[cent] > val) {right = cent - 1;} else {left = cent + 1;}
return erfen_digui(arr, val, left, right);
}
### 二分查找须要留神左右边界的状况