本节内容
二分查找算法
二分查找
通过与中间值进行比较,得出值所在的更小的范围。
 重复这个过程,直到发现值,或者不存在。
目标:有序的数组。
状态:左边界,右边界。
边界情况:
- 边界上:找到了,返回该边界索引。
 - 边界外:不存在,直接返回-1。
 - 边界距离过小(1格):不存在,返回-1。
 - 其他情况:二分法
 
API
public static Integer loop(Integer[] arr, Integer start, Integer end, Integer value) {
	//边界上
	if (arr[start] == value) {
		return start;
	} else if (arr[end] == value) {
		return end;
		//边界外
	} else if (arr[start] > value || arr[end] < value) {
		return -1;
		//一格以内,就说明没有
	} else if (end - start <= 1) {
		return -1;
	} else {
		System.out.printf("现在找:[%s,%s]\n", start, end);
		Integer index = (start + end) / 2;
		if (value > arr[index]) {
			return loop(arr, index, end, value);
		} else if (value < arr[index]) {
			return loop(arr, start, index, value);
		} else {
			return index;
		}
	}
}
 
全部代码
public class ErFenFind {
	public static void main(String[] args) {
		Integer[] target = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
		Integer result = loop(target, 0, target.length - 1, 2);
		System.out.println(result);
	}
	public static Integer loop(Integer[] arr, Integer start, Integer end, Integer value) {
		//边界上
		if (arr[start] == value) {
			return start;
		} else if (arr[end] == value) {
			return end;
			//边界外
		} else if (arr[start] > value || arr[end] < value) {
			return -1;
			//一格以内,就说明没有
		} else if (end - start <= 1) {
			return -1;
		} else {
			System.out.printf("现在找:[%s,%s]\n", start, end);
			Integer index = (start + end) / 2;
			if (value > arr[index]) {
				return loop(arr, index, end, value);
			} else if (value < arr[index]) {
				return loop(arr, start, index, value);
			} else {
				return index;
			}
		}
	}
}
 
测试










