/**
* 折半查找(二分查找)
* 条件:1.必须采用顺序存储结构 2.必须按关键字大小有序排列
* 递归法
* $arr 目标数组
* $k 要查找的数组
* $left 开始下标
* $right 结束下标
* return 查找到的下标
*/
function search_half_recursion($arr, $k, $left, $right) {
$mid = ceil(($left + $right) / 2); //取中间位的下标
if ($left > $right) { // 开始比结束大 说明不存在了
return 'not find';
}
if ($arr[$mid] < $k) {
return search_half_recursion($arr, $k, $mid + 1, $right);
} else if ($arr[$mid] > $k){
return search_half_recursion($arr, $k, $left, $mid - 1);
}else{
return $mid;
}
}
//非递归法
function search_half_while($arr, $k) {
$left = 0;
$right = count($arr) - 1;
while ($left <= $right) {
$mid = ceil(($left + $right) / 2);
if ($arr[$mid] < $k) {
$left = $mid + 1;
} else if ($arr[$mid] > $k) {
$right = $mid - 1;
} else {
return $mid;
}
}
return 'not find';
}
$arr = array(1, 3, 5, 7, 9, 12, 14, 25, 32, 67, 71, 82);
$k = 15;
//$r = search_half_recursion($arr, $k, 0, count($arr) - 1);
//print_r($r);
$r = search_half_while($arr, $k);
print($r);
PHP 折半查找(二分查找) 递归与非递归法
最新推荐文章于 2021-01-11 23:48:23 发布