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);
}
}
对于上面的快排算法其实还可以进行优化,主要在选定一开始的值的时候。这个值很关键。
如何优化以后再说。