快速排序步骤
- 取数组中间值
- 遍历数组剩余元素小于中间值的放左边,大于中间值的放右边
- 将左右循环如此直至不可再分
- 将已排好的合并
第一种处理方式:
<?php
function quick_sort($arr)
{
if (count($arr) <= 1){
return $arr;
}
// 取数组中间索引
$index = (int)floor(count($arr) / 2);
$value = $arr[$index];
// 移除中间元素
array_splice($arr, $index, 1);
// 初始化左右数组
$a_left = $a_right = [];
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i] < $value) {
array_push($a_left, $arr[$i]);
} else {
array_push($a_right, $arr[$i]);
}
}
$a_left = quick_sort($a_left);
$a_right = quick_sort($a_right);
array_push($a_left, $value);
// 合并左右数组
return array_merge($a_left, $a_right);
}
$arr=[2,6,3,9];
var_dump(quick_sort($arr));
算法中所用到的PHP内置函数参考
floor
floor — 舍去法取整
floor ( float
$value
) : float返回不大于
value
的最接近的整数,舍去小数部分取整。
array_splice
array_splice — 去掉数组中的某一部分并用其它值取代
array_splice ( array
&$input
, int$offset
[, int$length
= count($input) [, mixed$replacement
= array() ]] ) : array把
input
数组中由offset
和length
指定的单元去掉,如果提供了replacement
参数,则用其中的单元取代。
array_push
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_push ( array
&$array
, mixed$value1
[, mixed$...
] ) : intarray_push() 将
array
当成一个栈,并将传入的变量压入array
的末尾。array
的长度将根据入栈变量的数目增加。
array_merge
array_merge — 合并一个或多个数组
array_merge ( array
$array1
[, array$...
] ) : arrayarray_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。