java 实现对List做二分查找(支持泛型)
来源:互联网 发布:重装 mac 编辑:程序博客网 时间:2024/06/11 06:45
废话不多说 直接上代码:
public class Main { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); for(int i = 1 ; i< 21 ; ++i){ list.add(i); } find(1,list); find(20,list); find(15,list); find(6,list); } public static void find(Integer value,List<Integer> list){ System.out.println("value ["+value+"]" + " in position : " + BinarySearch.binarySearch(list,value)); }}/** * 二分查找 * */class BinarySearch { /** * @param list 有序列表 * @param lo 查找开始位置 * @param hi 查找的结束位置 * @param value 查找的元素 * @param comparator 比较器 * @return 如果找到 返回元素value的索引,否则返回 < 0 * */ public static <T> int binarySearch (List<T> list,int lo,int hi,T value,Comparator<? super T> comparator){ if(comparator == null){ throw new IllegalArgumentException("comparable can not be null!"); } if(!checkList(list)){ return 0; } checkBinarySearchBounds(lo, hi, list.size()); while (lo <= hi) { final int mid = (lo + hi) >>> 1; final T midVal = list.get(mid); if (comparator.compare(midVal,value) < 0 ) { lo = mid + 1; } else if (comparator.compare(midVal,value) > 0) { hi = mid - 1; } else { return mid; // value found } } return ~lo; // value not present } /** * @param list 有序列表 * @param value 查找的元素 * @param comparator 比较器 * @return 元素 如果找到 返回元素value的索引,否则返回 < 0 * */ public static <T> int binarySearch (List<T> list,T value,Comparator<? super T> comparator){ if(!checkList(list)){ return 0; } return binarySearch(list,0, list.size() - 1 ,value,comparator); } /** * @param list 有序列表,元素必须实现了Comparable接口 * @param lo 查找开始位置 * @param hi 查找的结束位置 * @param value 查找的元素 * @return 元素 如果找到 返回元素value的索引,否则返回 < 0 * */ public static <T extends Comparable<T>> int binarySearch (List<T> list,int lo,int hi, T value){ if(!checkList(list)){ return 0; } checkBinarySearchBounds(lo,hi, list.size()); while (lo <= hi) { final int mid = (lo + hi) >>> 1; final T midVal = list.get(mid); if (midVal.compareTo(value) < 0 ) { lo = mid + 1; } else if (midVal.compareTo(value) > 0) { hi = mid - 1; } else { return mid; // value found } } return ~lo; // value not present } /** * @param list 有序列表 元素必须实现了Comparable接口 * @param value 查找的元素 * @return 元素 如果找到 返回元素value的索引,否则返回 < 0 * */ public static <T extends Comparable<T>> int binarySearch (List<T> list, T value){ if(!checkList(list)){ return 0; } return binarySearch(list,0, list.size() - 1 ,value); } /** * @param list true代表list非空,否则为false * */ private static boolean checkList(List list){ return list != null && !list.isEmpty(); } private static void checkBinarySearchBounds(int startIndex, int endIndex, int length) { if (startIndex > endIndex) { throw new IllegalArgumentException(); } if (startIndex < 0 || endIndex > length) { throw new ArrayIndexOutOfBoundsException(); } }}
输出结果:
value [1] in position : 0value [20] in position : 19value [15] in position : 14value [6] in position : 5
阅读全文
0 1
- java 实现对List做二分查找(支持泛型)
- Java对查找算法的实现—二分查找(二)
- 二分查找(java实现)
- 二分查找(Java实现)
- 二分查找(Java实现)
- 二分查找 (java实现)
- 折半查找(二分查找)Java实现
- 二分查找(折半查找),Java实现
- 算法-对分查找(二分查找)C++实现
- Java实现 二分查找
- Java实现二分查找
- java实现二分查找
- java实现二分查找
- Java二分查找实现
- java 实现二分查找
- Java实现二分查找
- Java实现二分查找
- JAVA实现二分查找
- DevOps 学习(一)-DevOps 的相关概念
- 微信扫码支付模式二功能实现,回调,记录充值,整个完整流程,java开发
- android 获取系统顶部状态栏(Status Bar)与底部导航栏( 获取底部浮动菜单 Navigation Bar)的高度
- 【JavaScript 基础】07 内置对象
- DBA(oracle)常用的命令语句<dba权限>
- java 实现对List做二分查找(支持泛型)
- css动态效果引用
- ACM算法:线段树
- MAVEN项目打包成jar,供普通Java项目调用
- TensorFlow
- maven build 问题
- 初识Hibernate4
- 金蝶KIS/K3各版本下载地址
- CTF/CTF练习平台-前女友【弱类型】