介绍

在计算机科学中,二分查找算法(英语:binary search algorithm),也称折半搜索算法(英语:half-interval search algorithm)、对数搜索算法(英语:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

wikipedia

步骤

  • 有序序列
  • 取中间元素
  • 如果目标值等于中间元素,则找到目标值。
  • 如果目标值较小,继续在左侧搜索。
  • 如果目标值较大,则继续在右侧搜索

时空复杂度

时间复杂度:O(logN)
空间复杂度:O(1)

图解

7a4ab726d42b162fd14b3d09fa979e47c95322ba53584e0646309c3b2fa9bdf1file_1578027100655.jpeg
8ce178fcc07617d6448a086593c0bacc0d126d922a9a96f5c0b7995f1a16547afile_1578027100677.jpeg
e4e6a6becfb7a40e32f13ff17948abe9fdbcf26be7a2932950d5f6b0ffdd8afbfile_1578027100686.jpeg

实现

迭代方式

public int search(int[] nums, int target){
        int lo = 0;
        int hi = nums.length - 1;
        while(lo <= hi)
        {
            int mid = (lo + hi) >>> 1;
            if(nums[mid] < target) {
                lo = mid + 1;
            } else if(nums[mid] > target) {
                hi = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
 }

递归方式

    public int search(int[] nums, int target) {
        return search(nums, 0, nums.length - 1, target);
    }

    public int search(int[] nums, int lo, int hi, int target) {
        if (lo > hi) {
            return -1;
        }
        int mid = (hi + lo) >>> 1;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] > target) {
            return search(nums, lo, mid - 1, target);
        } else {
            return search(nums, mid + 1, hi, target);
        }
    }