二分查找算法,折半查找,PHP的实现

<?php
/*
* 算法要求:1,顺序的存储结构。2,按大小有序排列
*
* 算法查找过程:假设是一张升序的表,
* 1,关键字与中间位置比较,相等则查找成功。
* 2,大于中间位置,则将表对半拆,取后半段的表,然后重新对比中间位置的值。
* 3,小于中间位置,则将表对半拆,取前半段的表,然后重新对比中间位置的值。
* 4,如果中间位置与开始位置相等,则查找失败。
* Author: lms <php7在qq.com> QQ:二一九二4238
*  转发请注明来源网址
*   http://www.thinkunion.net
*   https://blog.csdn.net/weixin_43932088
*/
/*循环方式*/
function find_me($arr, $me){
    $begin=0;
    $end=count($arr);
    /*向下取整*/
    $mid=floor(($begin+$end)/2);
    while (true) {
        /*找到了*/
        if($me==$arr[$mid]){
            return $mid+1;
        /*大的一半*/
        }elseif($me>$arr[$mid]){
            $begin=$mid;
            $mid=floor(($begin+$end)/2);
        /*小的一半*/
        }elseif($me<$arr[$mid]){
            $end=$mid;
            $mid=floor(($begin+$end)/2);
        }
        /*找不到*/
        if($mid==$begin){
            return false;
        }
    }
}

/*递归方式*/
function find_me2($arr, $me, $begin, $end){
    $mid=floor(($begin+$end)/2);
    /*找到了*/
    if($me==$arr[$mid]){
        return $mid+1;
    /*大的一半*/
    }elseif($me>$arr[$mid]){
        find_me2($arr, $me, $mid, $end);
    /*小的一半*/
    }elseif($me<$arr[$mid]){
        find_me2($arr, $me, $begin, $mid);
    }
    /*找不到*/
    if($mid==$begin){
        return false;
    }
}

$arr=[1,2,3,4,5,6,7,8,9];
$me=2;
var_dump(find_me($arr,$me));
var_dump(find_me($arr,$me,0,count($arr)));

猜你喜欢

转载自blog.csdn.net/weixin_43932088/article/details/85983222