binarySearch方法详解——全网最细!!!!!

  • Post author:
  • Post category:其他




1.binarySearch方法调用的两种方法

1.Arrays.binarySearch(ints1,0,5,3);


2.Arrays.binarySearch(ints1,3);



1.1 第一种方式

解释:ints1 是传入的数组名,支持的类型是


所有的数组类型


不论是对象,引用,字符串,还是 字符,

总而言之,只要是数组,就能传入


第二个数字

:代表我们要搜索范围的下限下标 ,该下标包括在内

**第三个数字:**代表我们要搜索范围上限的下标,该下标不包括在内,包括该下标-1的下标,我们称为:

上限实际下标


**第四个数字:**我们要搜索的,

目标



2第二张方式

解释:第二种方式直接全数组搜索,第一个是数组,第二个是目标



2.binarySearch的返回值



2.1 返回值

1.

在范围内搜索到该目标

:返回目标的数组下标

2.

要搜索的目标比搜索范围的数字都大

:返回:

(上限实际下标+1)的负值

3.

要搜索的目标比搜索范围的数字都小

,返回:

(下限下标+1)的负值


4要搜索的目标在范围内:

返回:最后

中间值+1的负值



3源码:

private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
                                     Object key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            @SuppressWarnings("rawtypes")
            Comparable midVal = (Comparable)a[mid];
            @SuppressWarnings("unchecked")
            int cmp = midVal.compareTo(key);

            if (cmp < 0)
                low = mid + 1;
            else if (cmp > 0)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.
    }


对返回值结果源码的分析:


1.小于任何数字:

——————返回的return -(low + 1); 其中low一直不变,所以**(下限下标+1)的负值**


2.大于任何数字:

——————最以上限下标不变,low比上限大1,再加1就是实际上限+2

然后返回该负值


3.大小在内部:

——————但是没有搜索到:这时候,循环条件一定不成立,low>high

之前的low就和high一样的大小,mid

low

high,其中1,2 条件下最终也是,mid

low

high ,只不过有一个上限或者下限不变,以此好表示

在内部的最后还是返回其-(low + 1)



总结


-------只要找到该值,一定返回的是正数,否则一定返回的是负数,
通过和0的比较,来判断是否找到该值



版权声明:本文为weixin_43590500原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。