01-二分查找算法

1.二分查找的前提

  • 有序性

2.什么是二分查找

二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也可以是数组中某一区间的起始位置和终止位置

3.二分查找动图

image

4.普通二分查找代码

public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) {
            return -1;
        }
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;
        while (left <= right) {
            //防止精度溢出
            mid = left + ((right - left) >> 1);
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
    }

5.二分查找注意事项

  1. 为了防止数据溢出,将 mid = (left + right)>>1 换成 mid = left + ((right - left)>>1);
  2. while中的条件是 left <= right , 而不是 left < right
  3. left = mid + 1; right = mid - 1; 而不是 left = mid; right = mid;

6.二分查找的递归形式

  public static void main(String[] args) {
        int[] nums = {-1, 0, 3, 5, 9, 12};
        System.out.println(new _704_二分查找_递归写法().search(nums, 100, 0, nums.length-1));
    }

    public int search(int[] nums, int target, int left, int right) {
        if (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                return search(nums, target, ++mid, right);
            } else if (nums[mid] > target) {
                return search(nums, target, left, --mid);
            }
        }
        return -1;
    }
posted @ 2021-03-30 19:35  迁承_0204  阅读(78)  评论(0编辑  收藏  举报