PHP 实现快速排序(Quick sort)

开头先说一下,学习这些排序算法其实只是学习这些算法的思路,PHP开发的时候最好用PHP内置的排序函数,因为PHP内置的排序函数是底层代码实现的,比我们自己用PHP手动写的函数速度快得多得

我们用来排序的数组必须是符合

  1. 数组开始索引是明确的,一般是0。
  2. 数组索引的必须是连续的整型或者数字字符串或者两者混合。

比如:

//连续的数字字符串索引数组
 
$arr = [
    '0' => 3,
    '1' => 2,
    '2' => 4,
];
 
 
//连续的数字索引数组
 
 
$arr = [
    0 => 3,
    1 => 2,
    2 => 4,
];
 
 
//混合索引,数字和数字字符串都有
 
 
$arr = [
    '0' => 7,
    1 => 3,
    '2' => 2,
    3 => 4,
    '4'=> 6,
];
 
 
 
//这种字符串索引数组是不行的
 
$arr = [
    'a' => 3,
    'b' => 2,
    'c' => 4,
];
 
//这种不连续索引数组也是不行的
 
$arr = [
    0 => 3,
    2 => 2,
    3 => 4,
];

原理:大致讲下,把数组中第一个元素的值设为中间值,数组中小与等于这个中间值的元素分进一个新数组,数组中大于这个值的数也分进一个新数组,新数组继续按以上的逻辑一直分下去(分治),当分到的数组元素的个数小于2个的时候,把这个数组返回到上一层函数,上一层会把两个数组和中间值合并成一个数组再返回给上上层函数,当返回到没有上层函数的时候,返回的这个数组就是已经排序好的数组。(归并)

 

PHP 实现快速排序

升序

function quickSott($arr)
{
    $len = count($arr);

    if($len < 2){
        return $arr;
        //数组元素个数小于两个的情况下就不要继续分了,不然递归就没结束条件,数组就回不去了,数组要把来时的路走回去的。
        //这里返回给上一层函数的数组只有两种可能,一种是元素个数为 1 的数组,另一种是元素个数为 0 的空数组。
    }

    $middle = $arr[0]; 
    $left = [];
    $right = [];


    for($n = 1;$n<$len;$n++)
    {
        if($arr[$n]<=$middle) 
        {
            $left[] = $arr[$n]; //比中间值小的放左边数组
        }else{
            $right[] = $arr[$n]; //比中间值大的放右边数组
        }
    }


    return array_merge(quickSott($left),[$middle],quickSott($right));
    //继续分下去,不用怕分手,迟早会回来的,记得不要把中间值给抛弃了。

}

降序

function quickSott($arr)
{
    $len = count($arr);

    if($len < 2){
        return $arr;
    }

    $middle = $arr[0];
    $left = [];
    $right = [];


    for($n = 1;$n<$len;$n++)
    {
        if($arr[$n]>$middle) //大的放左边,小的放右边
        {
            $left[] = $arr[$n];
        }else{
            $right[] = $arr[$n];
        }
    }


    return array_merge(quickSott($left),[$middle],quickSott($right));

}

测试了手写的快速排序和PHP内置的sort函数的效率

数组元素等于25万个的情况下

快速排序平均需要0.45秒

PHP内置的sort函数平均需要 0.055秒

PHP内置的sort函数的效率是手写的快速排序函数的效率的8倍左右。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值