php实现归并排序

php实现归并排序:

这个排序我看了很久,大多数代码是从百度上看到的,因为我也是一个php的菜菜的,不过觉得应该把思路写下来,一方面是自己要总结一下,一方面是自己把思路写出来如果有哪里不对的地方也希望有人能帮我指正一下。

我感觉归并排序的归就在于递归,并就在于合并。

归并排序是分治法的一个重要的体现,所以我们需要用分治法的思想去考虑归并排序。它拿到一个数组了以后,这个数组就好像一个棍子,先将这个棍子掰成两半,然后我们再把分成一半的棍子再一分为二,那么它就这样被分下去,直到数组的长度等于1的时候就停下来,这就是归的那一步分。就是在将数组分成n分之一的时候,如何将它排好序再合并为一个数组。

在合并的时候它使用了一个辅助数组,就是先将已经不能再分的两块数组的第一个进行比较,将较小的先放入辅助数组中,然后再这样比较,直到两个数组中一个为空,然后只需要将另外一个数组全部都复制到辅助数组中后面的位置,一次合并就这样完成了,然后函数返回合并以后的数组。

遇到的问题:在合并数组的时候还是没有想清楚到底merge函数和merge_sort函数的功能到底是什么,merge_sort的功能其实就是将一个数组无线分割下去,分割到这个数组不能再分为止。然后merge函数的功能其实就是讲两个已经分割的数组再进行有序的合并,并将结果返回给merge_sort函数,然后merge_sort中的数组是引用的,所以就直接对数组进行了改变。

$arr=array(1,2,3,5,2,3,9,8,3,2,7,4,9,8,0,4,587,93,47,59,8,2,6,83,4,9,65,2,18,7);
printArr($arr);
echo "<hr>";
function merge_sort(&$arr){
    $len=count($arr);
    if($len==1)
        return $arr;
    $middle=intval($len/2);
    $left=array_slice($arr,0,$middle);
    $right=array_slice($arr,$middle);
    merge_sort($left);
    merge_sort($right);
    $arr=merge($left,$right);
}
function merge($leftarr,$rightarr){
    $arrmerge=array();
    while(count($leftarr) && count($rightarr))
        $arrmerge[]=$leftarr[0]<$rightarr[0]?array_shift($leftarr):array_shift($rightarr);
    return array_merge($arrmerge,$leftarr,$rightarr);
}
merge_sort($arr);
printArr($arr);
function printArr($arr){
    for($i=0;$i<count($arr);$i++)
        echo ' '.$arr[$i];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值