二分查找,也稱折半查找、二分搜索,是一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜素過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組已經爲空,則表示找不到指定的元素。這種搜索算法每一次比較都使搜索範圍縮小一半,其時間複雜度是O(logN)。java
package com.query.half.utils; import java.util.Comparator; /** * 二分查找 工具類 * @author huang * */ public class HalfQueryUtil { private HalfQueryUtil() { super(); } public static <T> int binarySearch(T[] list, T key, Comparator<T> comparator) { if(null == list || null == comparator) { return -1; } int retIndex = -1; int start = 0; int end = list.length; int middle = 0; int compareResult = 0; while(start < (end-1)) { middle = (start + end) >>> 1; compareResult = comparator.compare(list[middle], key); if(compareResult > 0) { // start = start; end = middle; } else if(compareResult < 0) { start = middle; // end = end; } else { retIndex = middle; break; } } return retIndex; } public static <T extends Comparable<T>> int binarySearch(T[] list, T key, int start, int end) { if(start <= end) { int middle = (start + end) >>> 1; int compareResult = key.compareTo(list[middle]); if(compareResult > 0) { start = middle + 1; // end = end; return binarySearch(list, key, start, end-1); } else if(compareResult < 0) { // start = start; end = middle - 1; return binarySearch(list, key, start, end-1); } else { return middle; } } return -1; } }
注:須要注意的是計算中間位置時不該該使用(high+ low) / 2的方式,由於加法運算可能致使整數越界,這裏應該使用如下三種方式之一:算法
end + (start – end) / 2
或數組
end + (start – end) >> 1
或工具
(end + start) >>> 1