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

来源:互联网 发布:电脑同时安装软件 编辑:程序博客网 时间:2024/06/04 20:04
/** * * @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语言算法书籍经典算法大全》)
原创粉丝点击