import java.util.Arrays; public class BinarySearch { private int[] values; public BinarySearch(int[] values) { if (values == null) throw new RuntimeException("values can not be null"); this.values = Arrays.copyOf(values, values.length); // 拷贝一份数据 Arrays.sort(this.values); // 正序排序 } /** * 二分查找是否包含某个值 * @param value 对应值 * @return 如果包含返回索引,如果不包含返回-1 */ public int contain(int value) { if (values.length == 0) return -1; int lowerIndex = 0; // 最低位 int upperIndex = values.length - 1; // 最高位 int currentIndex; while (true) { currentIndex = (lowerIndex + upperIndex)/2; // 二分计算 int currentVal = values[currentIndex]; // 获取当前值 if (currentVal == value) { // 匹配到值直接返回 return currentIndex; } else if (currentIndex == lowerIndex) { // 未匹配到值,且搜索项剩下2个的情况相等 int upperVal = values[upperIndex]; if (value == upperVal) { // 校验第二个值是否相等 return upperIndex; } else { return -1; } } else { if (value < currentVal) { // 落在值较小的区域 upperIndex = currentIndex; } else { // 落在值较大的区域 lowerIndex = currentIndex; } } } } public static void main(String[] args) { int[] vals = new int[]{2,4,5}; // 排序以后 [2,4,5] System.out.println(new BinarySearch(vals).contain(5)); } @Override public String toString() { return "BinarySearch{" + "values=" + Arrays.toString(values) + '}'; } }