php实现二分法查找

时间:2021-11-27 08:08:50

一、递归方法实现二分法查找:

注:前提是数组是有序数组;

原理:
1)先计算出数组的中间值并向上取整
2)判断中间值是否和要查找的值相同,相同则直接返回
3)不相同就判断大小如果比中间值大,就用array_slice从中间的下一个位置截取片段生成新数组,反之同样方法截取片段。
4)然后用递归的手法,直至找到相应元素,如果到最后也没有找到,也就是数组长度为1时还没有找到,就直接返回没有此元素;

function secSearch($data , $search){
    $mid = ceil(count($data) / 2) - 1;
    if( $data[$mid] == $search ){
        return $data[$mid];
    }
    if( count($data) == 1 ){
        return '没有找到';
    }
    if($data[$mid] > $search){
       $data =  array_slice($data,0,$mid);
       return twoF( $data,$search );
    }
    if( $data[$mid] < $search){
        $data =  array_slice($data,$mid+1);
        return twoF( $data,$search );
    }
}

二、普通方式实现
原理:
1)定义一个最小值和最大值,最小值为0,最大值为数组长度减1
2)while循环判断当最小值小于等于最大值时,定义一个中间值,为最大值和最小值的和除以2
3)如果中间值和要查找的值刚好相等,直接跳出循环
4)如果不相等,无非两种情况,大于或小于,当大于中间值时,给最小值赋值为中间值+1,小于时给最大值赋值为中间值减1,直至找到,或者当最大值小于最小值时跳出循环,返回找到或没找到

function search($data ,$search){
    $low = 0;
    $high = count($data) - 1;
    while( $low <= $high ){
        $mid = floor( ($low + $high) / 2 );
        if( $data[$mid] == $search ){
            return $data[$mid];
        }
        if( $data[$mid] > $search ){
            $high = $mid - 1;
        }
        if($data[$mid] < $search){
            $low = $mid + 1;
        }
    }
    return '没有找到';
}