php快速排序算法实现

php快速排序算法实现

快速排序是一个经典排序算法,他的排序速度更快,所以叫做快排。

像冒泡,插入,选择这种排序的时间复杂度是O(n^2),而快排的时间复杂度是O(nlogn),速度快上不少。

快排的原理是选定一个值,然后把数组中所有小于这个值的放左边,大于的放右边,然后对左边和右边的数组重复上述操作。

  • 选定一个值
  • 小于的放左边
  • 大于的放右边
  • 重复上述操作,也就是递归
  • 最后得到的就是排好序的数组

/**
 * 快速排序
 */
class QuickSort {

    /**
     * 快速排序
     * @param Array $arr 要排序的数组
     * @return Array $arr 排好序的数组
     */
    static function sort(Array $arr) {
        //递归终止条件,当只有一个的时候直接返回
        if (count($arr) <= 1) {
            return $arr;
        }
        //取第一个当中位数
        $mid = $arr[0];
        $l = $r = [];
        //循环一遍,小于的放左边,大于的放右边
        for ($i = 1; $i < count($arr); $i++) {
            if ($arr[$i] >= $mid) {
                $r[] = $arr[$i];
            } else {
                $l[] = $arr[$i];
            }
        }
        //左右递归
        $lsort = self::sort($l);
        $rsort = self::sort($r);
        
        //合并左边,中位数和右边
        return array_merge($lsort, [$mid], $rsort);
    }
}

对于上面的快排算法其实还可以进行优化,主要在选定一开始的值的时候。这个值很关键。

如何优化以后再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值