其他分享
首页 > 其他分享> > 二分查找

二分查找

作者:互联网

二分查找使用时的前提条件:

  1. 查找的内容在逻辑上是有序的。

  2. 查找的数量只能是一个。

二分法的思想:

  1. 选择数组中间的数字与目标值进行比较。

  2. 如果相等,返回答案。

  3. 如果不相等

    • 中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,右边的数字全部排除

    • 中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,左边的数字全部排除

抛去一个错误观念:

当数组长度是偶数时,怎么取最中间的数。千万不要纠结这个问题,这并不影响我们寻找目标数。

记住判断的核心思想:

所以数组长度是偶数时,并不一定要取最中间的数,这并不影响怎么排除的问题,无非就是多排除一个数字或者少排除一个数字。

真正影响结果的时,取的哪个中间数字要不要加入下一次判断的查找中,即边界值问题。

边界值问题:

  1. 左闭右闭区间

  2. 左闭右开区间

判断过程中,最重要的两个点:

  1. while循环中 left 与 right 的关系,到底是 left <= right 还是 left < right

  2. 迭代过程中 middle 和 right 的关系,到底是 right = middle - 1 还是 right = middle

左闭右闭区间的情况: 

public static void main(String[] args) {
        int[] nums = new int[]{-1, 0, 3, 9, 11, 13, 22, 27, 33, 57, 66, 77};
​
        //nums是数组,size是数组的大小,target是需要查找的值
        int search = new BinarySearch1().search(nums, nums.length, 33);
        System.out.println(search);
    }
​
    int search(int nums[], int size, int target)
    {
        int left = 0;
        int right = size - 1;   // 定义了target在左闭右闭的区间内,[left, right]
        while (left <= right) { //当left == right时,区间[left, right]仍然有效
            int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
            if (nums[middle] > target) {
                right = middle - 1; //target在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1;  //target在右区间,所以[middle + 1, right]
            } else {
                return middle;  //既不在左边,也不在右边,那就是找到答案了
            }
        }
        //没有找到目标值
        return -1;
    }

左闭右开区间的情况:

public static void main(String[] args) {
        int[] nums = new int[]{-1, 0, 3, 9, 11, 13, 22, 27, 33, 57, 66, 77};
​
        //nums是数组,size是数组的大小,target是需要查找的值
        int i = new BinarySearch1().search1(nums, nums.length, 27);
        System.out.println(i);
    }
​
    int search1(int nums[], int size, int target)
    {
        int left = 0;
        int right = size; //定义target在左闭右开的区间里,即[left, right)
        while (left < right) {  //因为left = right的时候,在[left, right)区间上无意义
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {
                right = middle; //target 在左区间,在[left, middle)中
            } else if (nums[middle] < target) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        // 没找到就返回-1
        return -1;
    }

 

 

标签:二分,right,target,nums,int,middle,查找,left
来源: https://www.cnblogs.com/l12138h/p/16263541.html