二分查找属于有序查找,查找过程:
- 将要查找的值,与中间值作比较,若相等则查找成功
- 若不相等,把线性表从中间分成两个表,再进行对比
- 若大于要查找的值,从后边的表继续查找
- 若小于要查找的值,从前边的表继续查找
- 递归步骤1、2、3、4直到查找到要查找的值
java实现
public void binarySearchTest() {
Integer[] arr = initArr();
// 二分查找属于有序查找算法,先对待查找的数组排序
quickSort(arr, 0, arr.length - 1);
int value = 83;// 要查找的值
int low = 0, height = arr.length - 1;
int index = binarySearchTest(arr, value, low, height);
System.out.println("index: " + index);
}
public int binarySearchTest(Integer[] arr, int value, int low, int height) {
// 判断首尾是否正好就是要查找的值
if (value == arr[low]) {
return low;
} else if (value == arr[height]) {
return height;
}
int mind = (low + height) / 2;// 取中间位置,将整个数组分成两个序列
if (value == arr[mind]) {
// 判断中间位置的值是否正好是要查找的值
return mind;
} else if (value < arr[mind]) {
// 如果要查找的值比中间值小,那么要查找的值在mind前边的序列,继续在0到mind-1位置的序列中递归查找
return binarySearchTest(arr, value, 0, mind - 1);
} else if (value > arr[mind]) {
// 如果要查找的值比中间值大,那么要查找的值在mind后边边的序列,继续在mind+1到length-1位置的序列中递归查找
return binarySearchTest(arr, value, mind + 1, height);
}
return -1;
}
注意:
- 二分查找是有序查找,对于静态有序表查找,旋律很高。但是对于频繁删除、插入,当需要维护有序性来花费非常大的工作量时,不建议使用二分查找
- 当数组长度非常大时,要注意(low + height) / 2 可能会出现超出Integer.MAX_VALUE益处的情况