PHP-排序-归并排序

归并排序:使用‘分治策略’,将一个大问题分割成小问题分别解决,然后用所有小问题的答案来解决整个大问题。

<?php 
    /*  
    merge函数
    1: 需要一个额外的数组
    2:把两个已经排序好的数组 通过移动指针,比较大小。小的放入额外数组中 指针往后移动。
    3:直到结束,如果排序号的数组还有多余的 则直接放入额外数组中。
    4:把额外数组存放到原数组中。此处要注意开始的下标是$left. 
    */
    function merge(&$arr,$left,$mid,$right){
        $arr_l = $left;
        $arr_r = $mid+1;
        while($arr_l<= $mid && $arr_r<=$right){              
            if($arr[$arr_l]<$arr[$arr_r]){
                $tmp[]=$arr[$arr_l++]; //$tmp[]额外数组
            }else{
                $tmp[]=$arr[$arr_r++];//此处为简写,与上一句对照相当于 $tmp[]=$arr[$arr_r];$arr_r++;
            }
        }       
        while($arr_l<=$mid){       //如果左侧数组有剩余,将其放到$tmp数组中
            $tmp[] = $arr[$arr_l++]; //++ 简写  
        }
        while($arr_r<=$right){           //如果右侧数组有剩余,将其放到$tmp数组中
            $tmp[] = $arr[$arr_r++];  //++ 简写
        }
        for($i=0,$len=count($tmp); $i<$len;$i++){// 数组的大小以$tmp的大小为准
            $arr[$left+$i]= $tmp[$i]; //$arr 从$left的位置开始
        }
    }
    function mSort(&$arr, $left, $right) {
      if($left == $right){//递归结束的条件。
          return;
        }else{            
        $center = floor(($left+$right) / 2);
        mSort($arr, $left, $center); //改变参数进行递归。
        mSort($arr, $center+1, $right);
        merge($arr, $left, $center, $right);
      }
    }
    $arr = [11,10,9,8,7,6,5,4,3,2,1,3];
    $left = 0;
    $right=count($arr)-1;
    mSort($arr,$left,$right);
    echo '<pre>';
    print_r($arr); 
?>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值