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的索引是1
Arrays.binarySearch(b, 20);    返回-4   21的索引是4
Arrays.binarySearch(b, 30);    返回-6   95的索引是6
Arrays.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.
}

最新文章

  1. 【FOL】第二周
  2. zjuoj 3607 Lazier Salesgirl
  3. myeclipse集成weblogicserver
  4. pycharm Run/Debug Configrations
  5. 百万行mysql数据库优化(补充)
  6. window.open打开新页面居中
  7. Unity属性的封装、继承、方法隐藏
  8. 基于JQ的单双日历,本人自己写的哈,还没封装,但是也能用
  9. Html 初识样式表&amp;选择器
  10. Android主题切换—夜间/白天模式探究
  11. python 文件和目录操作题库
  12. 阿里云CentOS安装PostgreSQL
  13. verilog 仿真时读取txt文件
  14. Quartz基础知识了解(一)
  15. Python词云分析
  16. IDEA查看一个类的所有继承关系
  17. codevs 1200 同余方程 逆元
  18. ueditor上传图片时目录创建失败的问题解决方法,不用那么麻烦,其实修改php/config.json这个配置文件里面的路径就行!!
  19. 【Pthon入门学习】多级菜单小例子
  20. rqnoj-208-奥运火炬到厦门-dp

热门文章

  1. Spring 梳理-Spring配置文件 -&lt;context:annotation-config/&gt;和&lt;context:component-scan base-package=&quot;&quot;/&gt;和&lt;mvc:annotation-driven /&gt; 的区别
  2. API离线查看工具【包括!!所用常用!!开发语言的API】
  3. .net core 3.0 Signalr - 06 业务实现-业务分析
  4. navicat工具 pymysql模块
  5. java架构之路-(面试篇)JVM虚拟机面试大全
  6. [Note] CentOS 命令
  7. Python3 学习笔记之 类型/运算符
  8. idea快捷键(mac下)
  9. Chrome插件开发(一)
  10. SEER流量众筹模块开发测试网络及使用文档发布