之前面试遇到过好几回这个问题,现在归置一下

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);