二分查找基本思想

二分查找算法的前提是要求待查序列有序,且不适用于序列需要经常变动的情况,整体实现的基本思想是,设置左右两个指针,标记查找片段的左右边界,每次与片段中间位置的值做对比,根据结果调整left和right,直到找到目标元素或查找完整个序列。

具体实现

基本实现就是在序列中找到目标值即可,对于边界限制的处理有[left,right]和[left,right)两种,大体思路一致,只是对于细节的处理有一些不同。

  • 两端闭区间处理
function find1(arr, target){
    let left = 0;
    let right = arr.length - 1; //right取最后一位有效值,搜索区间闭区间
    while(left <= right){
        let mid = Math.floor((right + left) / 2); //拿到中间index
        if(arr[mid] === target){ //如果与中间值相等,输出
            return mid;
        }else if(arr[mid] < target){ //如果大于中间值,说明在中间值右侧
            left = mid + 1;  //更新left,由于闭区间,中间值已经被比较过了,所以取mid + 1
        }else if(arr[mid] > target){ //如果小于中间值,说明在中间值左侧
            right = mid - 1;  //更新right,由于闭区间,中间值已经被比较过了,所以取mid - 1
        }
    }
    return -1;
}
  • 右侧开区间处理
function find2(arr, target){
    let left = 0;
    let right = arr.length; //right取arr的长度,搜索区间右侧开区间
    while(left <= right){
        let mid = Math.floor((right + left) / 2); //拿到中间index
        if(arr[mid] === target){ //如果与中间值相等,输出
            return mid;
        }else if(arr[mid] < target){
            left = mid + 1;  //更新left,由于闭区间,中间值已经被比较过了,所以取mid + 1
        }else if(arr[mid] > target){
            right = mid;  //更新right,由于右侧开区间,下次搜索区间不再包括边界值,所以直接取mid
        }
    }
    return -1;
}

wansoiar
3 声望0 粉丝