二分查找(Binary Search)

207 阅读1分钟

二分查找的过程

  1. 从数组的中间元素开始搜索, 如果找到目标元素, 则返回目标元素;
  2. 如果中间元素小于目标元素,则在大于中间元素的那一半查找;反之,则在小于中间元素的那一半查找;
  3. 重复第一步, 从剩余数组的中间元素继续搜索, 直到没有剩余的数组, 则代表没有查找到目标元素。

时间复杂度 O(logn)

空间复杂度 O(1)

const nums = [1,2,3,4,5,6,7,8,9]

function binarySearch(nums, target) {
    let start = 0, end = nums.length - 1;
    while(start <= end) {
        let mid = (start + end) >> 1;  //同 (开始坐标 + 结束坐标)/2 | 0 , 但相加可能出超出最大值。
        if(nums[mid] < target) {
            start = mid + 1
        }else if(nums[mid] > target) {
            end = mid - 1
        }else{
            return mid;
        }
    }
    return -1;
}
binarySearch(nums, 5) //4
binarySearch(nums, 10) //-1

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

const nums = [1,3,5]
function binarySearch(nums, target) {
    let len = nums.length;
    let start = 0, end = len - 1, index = len;
    while(start <= end) {
        let mid = start + (end - start) >> 1;
        if(target <= nums[mid]) {
            index = mid;
            end = mid - 1
        }else {
            start = mid + 1
        }
    }
    return index;
}
console.log(binarySearch(nums, 3)) //1
console.log(binarySearch(nums, 2)) //1
console.log(binarySearch(nums, 10)) //5
  1. 设返回的索引为 index , 如果在数组中找不到目标值,index 的默认值就是新值插入的位置。
  2. 通过二分查找, 找到最近大于等于 目标值的位置, 返回其索引。
  3. 大于等于目标值的数可能有多个, 每次 target <= nums[mid]时我们记录并更新一下其索引的位置, 跳出循环前一次保存的索引值, 就是最近大于等于 目标值的位置。