折半查找算法是一种常见的查找算法,适用于带查找序列有序的情况,空间复杂度O(1),时间复杂度O(log(n))。
算法实现常见非递归和递归两种,非递归使用循环控制while(start<=end),递归算法注意递归结束的条件(start>end)
public class BinarySearch {
/**
* 折半查找非递归算法
*
* @param a
* 带查找数组
* @param k
* 查找内容
* @return k在数组a中的下标,查找失败返回-1
*/
public int binarySearch(int a[], int k) {
int idx = -1;
if (null == a)
return idx;
int start = 0, end = a.length - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (a[mid] > k) {
end = mid - 1;
} else if (a[mid] < k)
start = mid + 1;
else {
idx = mid;
break;
}
}
return idx;
}
/**
* 折半查找递归算法
*
* @param a
* 待查找数组
* @param start
* 开始下标
* @param end
* 结束下标
* @param k
* 查找内容
* @return k在数组a中的下标,查找失败返回-1
*/
public int binarySearch(int a[], int start, int end, int k) {
int idx = -1;
// 递归终止条件 start<end
if (null == a || start < 0 || start > a.length || end > a.length
|| start > end)
return idx;
int mid = (start + end) / 2;
if (a[mid] > k) {
idx = binarySearch(a, start, mid - 1, k);
} else if (a[mid] < k)
idx = binarySearch(a, mid + 1, end, k);
else if (a[mid] == k)
return mid;
return idx;
}
public static void main(String[] args) {
int[] a = new int[] { 1, 2, 3, 4, 5 };
System.out.println(new BinarySearch().binarySearch(a, 7));
System.out.println(new BinarySearch().binarySearch(a, 0, 4, 3));
}
}