二分法的实现思路及代码

PHP算法------二分法

    • 二分法思路
    • 代码片段

二分法思路

  1. 区间必须是有序集合(也可以是数组最好是索引数组)
  2. 实现思路就是需要先排序(如果不是从小到大排序或者从大到小那么可能并不适合用二分法)
  3. 需要先知道数组个数然后设置初始的开始值(下标一般是从0开始)和结束值(个数减一因为是从0开始而数值是从开始算)
  4. 判断中间下表的值是否等于要找的值,如果不是,那就判断 中间值小于要找的值那么有可能值在中间到结尾的那个部分中,反之就是前边到中间值那部分中。

代码片段

代码如下:

// An highlighted block
  	$num = 123;
  	$array = [1,15,2,58,69,45,789,123,568,8,9,70,63,45,25,89,78,12];
	sort($array);
	echo dichotomy($array,$num);//返回值所属的下表位置
	function dichotomy ($array,$num)(
        $count = count($array);//计算数组个数
        $start = 0;//开始值
        $end = $count-1;//结束值
        $middle = intval(($count/2));//中间值下表
        while($start <= $end){
            if($array[$middle] == $num){  
                return $middle;
            }elseif($array[$middle] < $num){//如果这个值大于这个中间的值那么就是后半部分
                $start = $middle + 1;//重新复制开始值下表
                $middle = intval(($start+$middle)/2);//重新设置中间值
            }else{//这个小于中间值那么就是前半部分
                $end = $middle - 1;//重新复制结束下标
                $middle =  intval(($end+$middle)/2);
            }
        }
        return null;//不存在这个值
	 )

这是我自己根据网上的自己理解,自己写出来的可能有些地方不是最优的写法,欢迎指正,谢谢

你可能感兴趣的:(算法)