一、如果我们的目标对象在一个有序的线性表中,从小到达排列,我们就可以采用二分查找,也叫折半查找。
二分查找或折半查找的时间复杂度为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. }