排序算法之 - 快速排序 php

10 篇文章 0 订阅
5 篇文章 0 订阅

快速排序是处理大数据最快的排序算法之一了。

1.描述

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

2.逻辑

在区间中挑选一个元素作为基准,将小于基准的元素放在基准之前,大于基准的元素放在基准之后,在分别堆小数区和大数区进行排序。(小数、基准元素、大数)

1、取出一个数字,以改数字为界,将数组分割为小数组和大数组
2、将分割的数组重复1步骤,直到无法分割后,在重新合并起来
3、将小数组,中间数,大数组合并,排序完成
在这里插入图片描述

3.代码
$arr = [100, 20, 50, 49, 29, 15, 22, 8, 101, 50];
function quickSort($arr)
{
    $arrSize = count($arr);
    //如果数组长度小于等于1,没有分割必要,直接返回
    if ($arrSize <= 1) {         
        return $arr;
    }
    //取出中间数,以此为基准,将数组分割为两部分
    $middle = array_splice($arr, floor($arrSize / 2), 1)[0];
    $left = $right = [];
    for ($i = 0; $i < $arrSize - 1; $i++) {
        if ($arr[$i] < $middle) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    //将分割的数组,在放入函数中,继续分割到单位长度为1的数组,$left<中间数<$right,合并数组
    return array_merge(quickSort($left), [$middle], quickSort($right));
}
var_dump(quickSort($arr));
//array(10) { [0]=> int(8) [1]=> int(15) [2]=> int(20) [3]=> int(22) [4]=> int(29) [5]=> int(49) [6]=> int(50) [7]=> int(50) [8]=> int(100) [9]=> int(101) }
[8, 15, 20, 22, 29, 49, 50, 50, 100, 101]; 

附上参考连接

菜鸟教程《十大编程算法助程序员走上高手之路》https://www.runoob.com/w3cnote/the-friendship-algorithm-the-big-bang-theory.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种常用的排序算法,它的基本思想是通过一趟排序将待排序数据分割独立部分,其中一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据有序序列。 下面是一个使用PHP实现的快速排序算法的示例代码: ```php function quickSort($arr) { // 如果组长度小于等于1,则直接返回 $length = count($arr); if ($length <= 1) { return $arr; } // 选择一个基准元素 $pivot = $arr[0]; // 初始化左右组 $left = $right = array(); // 遍历组,将元素分到左右组中 for ($i = 1; $i < $length; $i++) { if ($arr[$i] < $pivot) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } // 递归调用快速排序,并将左右组合并 return array_merge(quickSort($left), array($pivot), quickSort($right)); } // 测试示例 $arr = array(5, 2, 8, 9, 1); $result = quickSort($arr); print_r($result); ``` 这段代码定义了一个名为`quickSort`的函,它接受一个待排序组作为参,并返回排序后的组。在函内部,首先判断组长度是否小于等于1,如果是,则直接返回原组。然后选择一个基准元素(这里选择第一个元素),遍历组,将比基准元素小的元素放入左组,将比基准元素大的元素放入右组。最后,递归调用`quickSort`函对左右组进行排序,并将排序后的左组、基准元素、排序后的右组合并返回。 运行上述示例代码,输出结果为:`Array ( => 1 => 2 => 5 => 8 => 9 )`,表示组已经按照从小到大的顺序排列好了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值