二分查找

基本概念

二分查找(Binary Search)算法,也叫折半查找算法。

二分查找的思想非常简单,有点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

算法复杂度O(logn)。

使用场景

在有序的数列中寻找某个数。

例如:我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。你来想想,如何快速猜中我写的数字呢?

假设我写的数字是 23,猜数过程如下。

二分查找的框架

function binarySearch(nums, target) {
    var left = 0; 
    var right = nums.length - 1; // 注意

    while(left <= right) { // 注意
        var mid = Math.floor((right + left) / 2);
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; // 注意
        else if (nums[mid] > target)
            right = mid - 1; // 注意
        }
    return -1;
}