递归解法
/**
* 二分查找————递归
* @param array $arr
* @param $num
* @return int
*/
function binarySearch(array $arr, $num) {
$length = count($arr);
if(0 == $length) {
return -1;
}
return binarySearchInternally($arr, $num, 0, $length - 1);
}
function binarySearchInternally(array $arr, $num, $l, $r) {
if($l > $r) {
return -1;
}
$midIndex = $l + intval(($r - $l) / 2); //左中间点
$midData = $arr[$midIndex];
if($num == $midData) {
return $midIndex;
}else if($num < $midData) {
return binarySearchInternally($arr, $num, 0, $midIndex - 1);
}else {
return binarySearchInternally($arr, $num,$midIndex + 1, $r);
}
}
循环解法
/**
* 二分查找————非递归
* @param array $arr
* @param $num
* @return int
*/
function binarySearch2(array $arr, $num) {
$length = count($arr);
$left = 0;
$right = $length - 1;
while($left <= $right) {
$midIndex = $left + intval(($right - $left) / 2);
$midData = $arr[$midIndex];
if($midData == $num) {
return $midIndex;
}else if($midData < $num) {
$left = $midIndex + 1;
}else{
$right = $midIndex - 1;
}
}
return -1;
}
时间复杂度分析
由于二分查找每次将数据分为一半,即:
n,n/2,n/4,…,n/(2^k)
每一次只需要一次比较,因此时间复杂度就是O(k),k为要查找的次数,n/(2^k)=1,得到k=logn,因此二分查找的时间复杂度为O(logn)。