二分查找,也成为折半搜索算法(Wiki).
使用二分查找的前提是数组是有序的,时间复杂度O(logn),空间复杂度O(1).
实现上有递归和非递归两种方式。
递归方式:
/**
* 二分查找:递归方式
*
* @param a
* 有序数组
* @param t
* 需要查找的目标值
* @return 目标值在数组中的index
*/
public static int binarySearch(int[] a, int t, int start, int end) {
if (start <= end) {
int middle = (start + end) / 2;
if (t == a[middle]) {
return middle;
} else if (t > a[middle]) {
return binarySearch(a, t, middle + 1, end);
} else {
return binarySearch(a, t, start, middle - 1);
}
} else {
return -1;
}
}
非递归方式:
/**
* 二分查找:非递归方式
*
* @param a
* 有序数组
* @param t
* 需要查找的目标值
* @return 目标值在数组中的index
*/
public static int binarySearch(int[] a, int t) {
int low = 0, high = a.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (t == a[middle]) {
return middle;
} else if (t > a[middle]) {
low = middle + 1;
} else {
high = middle - 1;
}
}
return -1;
}
所有的递归方式都能写成非递归方式,递归方式理解上更好理解,但是效率并不高。