本节内容
二分查找算法
二分查找
通过与中间值进行比较,得出值所在的更小的范围。
重复这个过程,直到发现值,或者不存在。
目标:有序的数组。
状态:左边界,右边界。
边界情况:
- 边界上:找到了,返回该边界索引。
- 边界外:不存在,直接返回-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;
}
}
}
}