/** * * @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语言算法书籍《经典算法大全》)
PHP实现常见算法之二分查找法
最新推荐文章于 2023-03-13 17:22:01 发布