Java基础(39)Arrays.binarySearch方法
2024-08-26 01:48:38
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.
}
最新文章
- 【FOL】第二周
- zjuoj 3607 Lazier Salesgirl
- myeclipse集成weblogicserver
- pycharm Run/Debug Configrations
- 百万行mysql数据库优化(补充)
- window.open打开新页面居中
- Unity属性的封装、继承、方法隐藏
- 基于JQ的单双日历,本人自己写的哈,还没封装,但是也能用
- Html 初识样式表&;选择器
- Android主题切换—夜间/白天模式探究
- python 文件和目录操作题库
- 阿里云CentOS安装PostgreSQL
- verilog 仿真时读取txt文件
- Quartz基础知识了解(一)
- Python词云分析
- IDEA查看一个类的所有继承关系
- codevs 1200 同余方程 逆元
- ueditor上传图片时目录创建失败的问题解决方法,不用那么麻烦,其实修改php/config.json这个配置文件里面的路径就行!!
- 【Pthon入门学习】多级菜单小例子
- rqnoj-208-奥运火炬到厦门-dp
热门文章
- Spring 梳理-Spring配置文件 -<;context:annotation-config/>;和<;context:component-scan base-package=";";/>;和<;mvc:annotation-driven />; 的区别
- API离线查看工具【包括!!所用常用!!开发语言的API】
- .net core 3.0 Signalr - 06 业务实现-业务分析
- navicat工具 pymysql模块
- java架构之路-(面试篇)JVM虚拟机面试大全
- [Note] CentOS 命令
- Python3 学习笔记之 类型/运算符
- idea快捷键(mac下)
- Chrome插件开发(一)
- SEER流量众筹模块开发测试网络及使用文档发布