您的位置:首页 > 编程语言 > Java开发

JAVA二分查找源码阅读

2017-03-30 10:37 232 查看

JAVA二分查找

public static <T> int binarySearch(T[] a, int fromIndex, int toIndex,T key, Comparator<? super T> c) {
//首先进行范围检查   1
rangeCheck(a.length, fromIndex, toIndex);
//然后进行二分查找   2
return binarySearch0(a, fromIndex, toIndex, key, c);
}


1 rangeCheck

private static void rangeCheck(int arrayLength, int fromIndex, int toIndex) {
//如果起始下标大于结束下标抛出异常
if (fromIndex > toIndex) {
throw new IllegalArgumentException(
"fromIndex(" + fromIndex + ") > toIndex(" + toIndex + ")");
}
//如果起始下标小于0 抛出数组越界异常
if (fromIndex < 0) {
throw new ArrayIndexOutOfBoundsException(fromIndex);
}
//如果结束下标大于数组长度 抛出数组越界异常
if (toIndex > arrayLength) {
throw new ArrayIndexOutOfBoundsException(toIndex);
}
}


2 binarySearch0

private static <T> int binarySearch0(T[] a, int fromIndex, int toIndex,T key, Comparator<? super T> c) {
//查看比较器Compator是否是null
if (c == null) {
//执行默认比较器  3
return binarySearch0(a, fromIndex, toIndex, key);
}
//省略
}


3 binarySearch0(a, fromIndex, toIndex, key);

private static int binarySearch0(Object[] a, int fromIndex, int toIndex,Object key) {
//起始坐标给low
int low = fromIndex;
//终止坐标给high
int high = toIndex - 1;
//循环开始 如果 high >= low 那么执行
while (low <= high) {
//>>>右移运算符  (low+high)/2
int mid = (low + high) >>> 1;
@SuppressWarnings("rawtypes")
//取出中间这个值
Comparable midVal = (Comparable)a[mid];
@SuppressWarnings("unchecked")
//进行比较
int cmp = midVal.compareTo(key);
//如果cmp小于0 说明 key大于a[mid]
if (cmp < 0)
//那么low变为mid+1
low = mid + 1;
else if (cmp > 0)
//key小于a[mid] 那么high变成mid-1
high = mid - 1;
else
//如果cmp==0那么key等于a[mid]返回mid下标
return mid; // key found
}
//循环直到low > high时 结束
//返回最相近的坐标的相反数
return -(low + 1);  // key not found.
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java