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) +
'}';
}
}