php排序笔记-归并排序

归并排序

将数组分为左右两部分,然后分别排序,最后再合并

 public function _sort(&$arr,$left,$right){

        if($left<$right){
            //如果做小于右则,取出中间值,取整。进入递归过程。
            $mid = floor(($left+$right)/2);

            $this->_sort($arr,$left,$mid);
            $this->_sort($arr,$mid+1,$right);
            $this->_merge($arr,$left,$mid,$right);
        }
    }

    public function _merge(&$arr,$left,$mid,$right){
        $i = $left;
        $j = $mid+1;
        $tmp = [];

        //将两段中最小值取出来,放入临时数组。如果越界则跳出循环。
        while($i<=$mid && $j<=$right){
            if($arr[$i]<$arr[$j]){
                $tmp[]=$arr[$i++];
            }else{
                $tmp[]=$arr[$j++];
            }
        }

        //判断,左边是否存在,有则将左边剩余部分全部放到tmp中
        while($i<=$mid){
            $tmp[]=$arr[$i++];
        }
        //判断,右边是否存在,有则将右边剩余部分全部放到tmp中
        while($j<=$right){
            $tmp[]=$arr[$j++];
        }
        //将临时数组中数据复制给$arr
        for($k=0,$len=count($tmp);$k<$len;$k++){
            $arr[$left+$k]=$tmp[$k];
        }
       

    }

 

posted @ 2019-07-03 16:46  不负_时光  阅读(139)  评论(0编辑  收藏  举报