PHP 8.4未新增排序函数,面试重点是手写健壮的三路快排:选基准、分小于/等于/大于三组、递归合并;需掌握时间复杂度、原地优化及稳定性等追问点。

PHP 8.4 本身没有新增排序算法内置函数,但面试中“手写快速排序”仍是高频考点。刷题关键不在版本号,而在理解原理、写出健壮可读的代码,并能应对边界和优化点。
重点不是 PHP 8.4 特性,而是你能否在 PHP 环境下正确、清晰、高效地实现快排逻辑。
快速排序的核心逻辑要讲清楚
快速排序是典型的分治(Divide & Conquer)算法:
选一个基准值(pivot),把数组分成三部分——小于 pivot、等于 pivot、大于 pivot;再递归处理左右两部分。
PHP 中推荐用“三路快排”(Three-way QuickSort)来天然处理重复元素,避免最坏 O(n²) 情况恶化,也更贴合实际数据(比如用户 ID、状态码常有大量重复)。
刷题时建议这样写(带注释、可运行、含边界处理)
function quickSort(array $arr): array
{
if (count($arr) <= 1) {
return $arr;
}
$pivot = $arr[0];
$less = $equal = $greater = [];
foreach ($arr as $val) {
if ($val < $pivot) {
$less[] = $val;
} elseif ($val === $pivot) {
$equal[] = $val;
} else {
$greater[] = $val;
}
}
return array_merge(
quickSort($less),
$equal,
quickSort($greater)
);
}✅ 优点:逻辑直白、无指针/索引易错、自动稳定处理重复值、适合面试白板或在线判题
⚠️ 注意:这不是原地排序(空间复杂度 O(n)),但面试中只要说明取舍即可(如:“为可读性和安全性放弃原地,若需优化可用双指针分区”)
面试官常追问的几个点,提前准备好答案
时间复杂度?
平均 O(n log n),最坏 O(n²)(每次 pivot 极端偏斜,如已排序数组选首元素)。可通过随机选 pivot 或三数取中缓解。能不能原地排序?怎么改?
可以。用左右双指针在原数组内 partition,递归调用时只传索引范围(quickSortInPlace(&$arr, $low, $high))。需要熟练掌握while移动、交换、边界收缩逻辑。稳定性如何?
基础快排不稳定(相等元素可能跨区交换)。三路快排中equal组保持相对顺序,但整体仍不保证稳定;如需稳定,应选归并排序。-
PHP 中有没有现成替代?
usort()是快排实现(底层 zend_qsort),但面试考的是你造轮子的能力,不是调库能力。立即学习“PHP免费学习笔记(深入)”;
刷题平台推荐练法(PHP 友好)
-
LeetCode 中文站:搜“912. 排序数组”,切换语言为 PHP,提交你的
quickSort函数(输入是array,输出也是array) - 力扣国际站(LeetCode.com):题号 912 同样支持 PHP,可对比官方解与你写的差异
- 自测用例建议覆盖:
- 空数组、单元素
- 全相同元素(如
[5,5,5]) - 已升序/降序
- 含负数、浮点数(PHP 中
===对 float 要小心,可用<和>判断)
不复杂但容易忽略:面试写完别忘了口头补一句——
“实际项目中我会直接用 sort() 或 usort(),手写快排主要是为了考察分治思维和边界处理能力。”



















