一、如果我们的目标对象在一个有序的线性表中,从小到达排列,我们就可以采用二分查找,也叫折半查找。
二分查找或折半查找的时间复杂度为O(logn)。
二、闲话少说,直接上代码
/**
* 二分查找、折半查找
* @param array 目标有序序列,从小到大排列
* @param target 待查找的目标对象
* @param fromIndex 数组的开始查找下标位置
* @param toIndex 数组的结束查找下标位置
* @return 数组的位置
*/
private static int binarySearch(int[] array, int target, int fromIndex, int toIndex) {
if (fromIndex > toIndex) {
return -(fromIndex+1);
}
while(toIndex >= fromIndex){
int mid = (fromIndex + toIndex) / 2;
if (array[mid] == target) {
return mid;
}else if (target < array[mid]) {
toIndex = mid - 1;
} else {
fromIndex = mid + 1;
}
}
return -(fromIndex+1);
}
若我们的目标对象实现了Comparable接口,我们还可写成通用的形式
/**
* 二分查找、折半查找
* @param array 目标有序序列,从小到大排列
* @param target 待查找的目标对象
* @param fromIndex 数组的开始查找下标位置
* @param arrayLength array.length
* @return 数组的位置
*/
private static int binarySearchByComparable(Object[] array, int fromIndex, int arrayLength, Object key) {
int low = fromIndex;
int high = arrayLength - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
@SuppressWarnings("rawtypes")
Comparable midVal = (Comparable) array[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.
}