递归查找
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); }
### 二分查找须要留神左右边界的状况