public class BinarySearchTest {
public static void main(String[] args) {
int[] a = {2, 3, 5, 7, 89};
System.out.println(binarySearch(a, 5));
System.out.println(binarySearch(a, 0));
System.out.println(binarySearch(a, 6));
System.out.println(binarySearch(a, 99));
System.out.println(binarySearch(a, 1));
}
/**
* 算法的思想就是:从数组中间开始,每次排除一半的数据,时间复杂度为O(lgN)。
* 这依赖于数组有序这个性质。如果val存在数组中,则返回t在数组的位置;否则,不存在则返回-(start+1)。
*
* @param array 数组
* @param val 查找的值
* @return
*/
public static int binarySearch(int[] array, int val) {
int start = 0;
int end = array.length - 1;
while (start <= end) {
int m = start + (end - start) / 2;//防止溢出,如果start和end都大于int最大值的一半,会发生溢出
if (array[m] > val) {
end = m - 1;
} else if (array[m] < val) {
start = m + 1;
} else {
return m;
}
}
//为什么val不存在数组中时不是返回-1而要返回-(start+1)。
//1如果查找不成功,则start的值恰好是val应该在数组中插入的位置。
//2之所以返回-(start+1)而不是直接返回 -start 是因为start可能为0,
//如果直接返回-start就无法判断是正常返回位置0还是查找不成功返回的0。
return -(start + 1);
}
}