二分查找(Binary Search)也叫折半查找,是一种日常生活中也很常见的查找方式。
举个生活中的小例子,我女朋友很喜欢让我猜她买的东西的价格。比如一个商品,肉眼估值大概在1000以内(假设价格是800)。猜价格的方式如下:
- 因为肉眼估值是1000以内的,即0-1000,我会先猜中间数500,然后得知猜低了
- 然后我可以知道价格在500-1000之间,再猜中间数750,得知还是猜低了
重复这个步骤,就可以很快得知最终价格。
是不是很好理解二分查找的思想,二分查找是针对有序数组,通过每次将待查找值和数组候选区域的中间值做比较来判断是否相等,如果相等则查找成功,如果不相等,则缩小候选区为原来的一般,继续根据新的候选区的中间值比较,直到找到待查找值或者候选区域缩小为空。
上图
代码实现如下:
package search;
/**
* @author TioSun
* 二分查找
*/
public class BinarySearch {
/**
* 二分查找
* @param a 待查找数组
* @param n 数组容量
* @param target 待查找值
* @return 待查找值所处下标
*/
public int search(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
// 不用(low+high)/2是为了防止整形溢出
int mid = low + (high - low) / 2;
if (mid == target) {
return mid;
} else if (mid > target) {
// 中间值比目标值大,说明目标值可能在中间值的左半区域
high = mid - 1;
} else {
// 中间值比目标值小,说明目标值可能在中间值的右半区域
low = mid + 1;
}
}
return -1;
}
}
我们能够发现每次查找都会减半待查询区域,所以二分查找的时间复杂度为O(logn)
网友评论