之前面试遇到过好几回这个问题,现在归置一下
1.递归,也可用来做插值查找
<?php
//search函数 其中$array为数组,$k为要找的值,$low为查找范围的最小键值,$high为查找范围的最大键值
function seekKey($array, $k, $low=0, $high=0){
//判断是否为第一次调用
if(count($array)!=0 && $high == 0){
$high = count($array);
}
if($low <= $high){//如果还存在剩余的数组元素
$mid = intval(($low+$high)/2);//取$low和$high的中间值
if ($array[$mid] == $k){//如果找到则返回
return $mid;
}elseif ($k < $array[$mid]){//如果没有找到,则继续查找
return seekKey($array, $k, $low, $mid-1);
}else{
return seekKey($array, $k, $mid+1, $high);
}
}
return -1;
}
$array = array(4,5,7,8,9,10);//测试search函数
echo seekKey($array, 9);//调用search函数并输出查找结果
2.while
<?php
$arr = array(1,2,3,4,5,6,7,8,9,10);
function search($data,$num){
$count = count($data);
$high = $count-1;
$low = 0;
while($high >= $low){
$mid = intval(($high+$low)/2);
if($data[$mid] > $num){
$high = $mid-1;
}elseif($data[$mid] < $num){
$low = $mid+1;
}else{
return $mid;
}
}
return -1;
}
$res = search($arr,4);
var_dump($res);
已有 0 条评论