PHP 8.4未新增排序算法,所谓“双指针快排”实为用原生语法实现的Hoare分区方案:选基准值,左右指针双向扫描并交换逆序元素,效率高于Lomuto单指针法。

PHP 8.4 中并没有新增或修改排序算法的内置函数,所以“PHP 8.4 快速排序双指针法”本质上仍是用 PHP 原生语法实现的经典快排(Lomuto 或 Hoare 分区方案),只是运行在 PHP 8.4 环境下。双指针法通常指 Hoare 分区方案:左右两个指针从数组两端向中间扫描,交换逆序元素,比单指针(Lomuto)更高效、交换次数更少。
Hoare 双指针快排的核心逻辑
选一个基准值(pivot),一般取首/尾/中位数;左指针 $i 从左向右找 ≥ pivot 的元素,右指针 $j 从右向左找 ≤ pivot 的元素;一旦两者都停住且 $i ,就交换;最后返回 <code>$j 作为新分界点。
- 分区后,
$j左侧所有元素 ≤ pivot,右侧 ≥ pivot(注意:pivot 不一定落在最终位置) - 递归处理
[left, j]和[j+1, right]两个子区间 - PHP 8.4 支持联合类型、只读类等,但快排实现无需新特性,保持简洁即可
PHP 8.4 兼容的 Hoare 双指针快排实现
以下代码在 PHP 8.4 下可直接运行,使用严格类型提示(可选),支持整数和字符串数组:
function quickSort(array $arr, int $low = 0, int $high = -1): array
{
if ($high === -1) {
$high = count($arr) - 1;
}
<pre class="brush:php;toolbar:false;">if ($low <p>}</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill2138" title="PHP"><img
src="https://img.php.cn/upload/skill/000/000/081/178884013267959.jpg" alt="PHP" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill2138" title="PHP" class="overflowclass">PHP</a>
<p class="overflowclass">编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。</p>
</div>
<a rel="nofollow" href="/xiazai/skill2138" title="PHP" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>function hoarePartition(array &$arr, int $low, int $high): int
{
$pivot = $arr[$low]; // 基准选最左
$i = $low - 1;
$j = $high + 1;</p><pre class="brush:php;toolbar:false;">while (true) {
do {
$i++;
} while ($arr[$i] $pivot);
if ($i >= $j) {
return $j;
}
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}}
// 使用示例 $nums = [3, 6, 8, 10, 1, 2, 4]; $sorted = quickSort($nums); print_r($sorted); // [1,2,3,4,6,8,10]
注意事项与优化建议
实际项目中不建议手写快排——PHP 内置 sort()、usort() 已高度优化(底层用混合算法,含快排、插入、堆排),性能远超纯 PHP 实现。但学习目的下需注意:
- 避免最坏情况(已排序数组):可随机选 pivot 或用三数取中法提升稳定性
- 小数组(如长度
- PHP 8.4 的 JIT 编译对递归影响有限,深度过大仍可能栈溢出,生产环境务必加递归深度保护或改用迭代版
- 若需稳定排序(相同值相对位置不变),快排本身不稳定,应选归并或 usort + 索引辅助
对比 Lomuto 单指针方案
Lomuto 更易理解(一个指针记录小于 pivot 的边界),但平均多约 3x 交换次数;Hoare 在随机数据下更快,且天然支持重复元素较多的场景。PHP 手写推荐 Hoare,但仅限教学或特殊约束(如必须原地、不可用额外空间)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










