开头先说一下,学习这些排序算法其实只是学习这些算法的思路,PHP开发的时候最好用PHP内置的排序函数,因为PHP内置的排序函数是底层代码实现的,比我们自己用PHP手动写的函数速度快得多得多。
我们用来排序的数组必须是符合
- 数组开始索引是明确的,一般是0。
- 数组索引的必须是连续的整型或者数字字符串或者两者混合。
比如:
//连续的数字字符串索引数组
$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倍左右。