博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础(39)Arrays.binarySearch方法
阅读量:5069 次
发布时间:2019-06-12

本文共 1564 字,大约阅读时间需要 5 分钟。

  1.源码中可以看到,binarySearch方法调用了binarySearch0方法,binarySearch0方法才是标准的二分查找实现。

  2.对于binarySearch0方法来说,注意最后的return语句return -(low + 1); // key not found.,也就是说,在没有发现要查找的key的时候,返回的是负的插入点值,所谓插入点值就是第一个比key大的元素在数组中的索引,而且这个索引是从1开始的。

例如:有数组{4,6,10,21,25,95}分别执行下面的查询操作:Arrays.binarySearch(b, 10);    返回2  (找到了关键字,索引从0开始) 如果找不到,就从第一个数开始,索引为1,那么插入点值为4(1),6(2),10(3),21(4),25(5),95(6)Arrays.binarySearch(b, 2);     返回-1   4的索引是1Arrays.binarySearch(b, 20);    返回-4    21的索引是4Arrays.binarySearch(b, 30);    返回-6    95的索引是6Arrays.binarySearch(b, 100);   返回-7    100不在数组中,比所有元素都大,插入点值为b.length+1为7 为什么要用-(low+1)呢,因为假如用-low的话,查找2和查找4的结果都是0,这样就不对了。

  3.调用binarySearch方法之前要先调用Arrays.sort方法对数组进行排序,否则得出的返回值不定。

public static int binarySearch(Object[] a, Object key) {        return binarySearch0(a, 0, a.length, key);    }    // Like public version, but without range checks.    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.    }

 

转载于:https://www.cnblogs.com/BigJunOba/p/9579952.html

你可能感兴趣的文章
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
4.9 Parser Generators
查看>>
redis集群如何清理前缀相同的key
查看>>
redis7--hash set的操作
查看>>
20.字典
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
oracle用户锁定
查看>>
(转)盒子概念和DiV布局
查看>>
Android快速实现二维码扫描--Zxing
查看>>
获取元素
查看>>
nginx+lighttpd+memcache+mysql配置与调试
查看>>
proxy写监听方法,实现响应式
查看>>
前端工具----iconfont
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>