PHP实现常见算法之二分查找法

/**
 *
 * @Name 二分法 - 指定key的所在位置
 *
 * @Rm  二分法使用场景:  查找数组必须为:有序数字索引数组(从小到大)
 *
 * @Thinking
 *      在二分搜寻法中,从数列的中间开始搜寻,如果这个数小于我们所搜寻的数,由于数列已排序,
 *  则该数左边的数一定都小于要搜寻的对象,所以无需浪费时间在左边的数;如果搜寻的数大于所搜寻
 *  的对象,则右边的数无需再搜寻,直接搜寻左边的数。
 *
 * @param int $obj_len
 * @param array $Arr
 * @param int $find
 *
 *
 * @return float|int
 *
 */
function DichotomySearch(int $obj_len,array $Arr,int $find){
    $start              = 0;
    $end                = $obj_len-1;
    $num                = 1;

    while ($start <= $end){

        $avg            = intval(($start + $end) / 2);

        if($Arr[$avg] < $find){
            $start      = $avg + 1;
        }else if($Arr[$avg] > $find){
            $end        = $avg - 1;
        }else{
            echo "本次查询循环次数为: ".$num.PHP_EOL;
            return $avg;
        }
        $num++;
    }
    return -1;
}


//创建数组
$arr_list       = [10,11,14,16,18,19,21,29,30,36,38,42,43,47,49,50,53,54,57,80,84,94,96,102,105,107,120,125,129,138,139,140,150,188,190,200];
sort($arr_list);
$index          = DichotomySearch(count($arr_list),$arr_list,80);


echo "查 询 到的数据值为:".$arr_list[$index].PHP_EOL;
echo "找到对应位置索引为:".$index.PHP_EOL;


 查找结果( 即运行结果 )如下
  本次查询循环次数为: 4
  查 询 到的数据值为80
  找到对应位置索引为19

 ( 本文参考C语言算法书籍经典算法大全》)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值