原理
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。

复杂度分析
被查找的区间的的大小变化为、
、
.....
,其中
=1,所以,经过了 k 次区间缩小操作,时间复杂度就是O(k)。通过
=1,我们可以求得
,所以时间复杂度就是 O(logn)。
代码实现php版
非递归实现
function bearch($arr, $value)
{
$low = 0;
$height = count($arr)-1;
while ($low <= $height) {
$middle = (int)(($low + $height)/2);
if ($arr[$middle] == $value) {
return $middle;
} elseif ($arr[$middle] > $value) {
$height = $middle+1;
} else {
$low = $middle-1;
}
}
return false;
}
递归实现
function bearch($arr, $low, $height, $value)
{
if ($low > $height) {
return false;
}
$middle = (int)(($low + $height)/2);
if ($arr[$middle] == $value) {
return $middle;
} elseif ($arr[$middle] > $value) {
return bearch($arr, $low, $middle+1, $value);
} else {
return bearch($arr, $middle-1, $height, $value);
}
}
二分查找的使用条件(局限性)
- 二分查找需要使用下标来访问随机数据所以二分查找依赖数组
- 二分查找依赖有序数据,因此只能用在插入、删除操作不频繁,一次排序多次查找的场景中。
- 数据量太小不适合二分查找。
- 数据量太大也不适合二分查找,因为依赖数组所以需要连续的内存,不利于零散内存的使用。