快速排序是处理大数据最快的排序算法之一了。
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