基数排序是一种非比较型整数排序算法,通过按个位、十位等各位数字分组并用计数排序稳定排序实现整体有序,时间复杂度为o(d×(n+k)),php8.2中需注意空数组判空、使用intdiv()和str_pad()等新特性。

什么是基数排序
基数排序是一种非比较型整数排序算法,它通过按数字的每一位(个位、十位、百位……)分组并稳定排序来实现整体有序。PHP 中常用计数排序作为子过程来完成每一轮的“按某一位排序”,整个过程不依赖元素间的大小比较,时间复杂度稳定为 O(d × (n + k)),其中 d 是最大数的位数,n 是元素个数,k 是进制(通常为10)。
PHP8.2 实现要点说明
PHP 8.2 对数组处理更严格,需注意:不能对空数组调用 array_reduce 或 max() 而不加判空;intdiv() 和 str_pad() 更推荐用于位数对齐;避免使用已被弃用的 create_function 等函数。以下实现兼容正整数,支持自动推导位数,且内部使用稳定的计数排序作为子程序。
完整可运行代码(含注释)
// 基数排序主函数,仅支持非负整数
// 输入:整数数组,如 [170, 45, 75, 90, 2, 802, 24, 66]
// 输出:升序排列的新数组
function radixSort(array $arr): array {
if (empty($arr)) return $arr;
// 检查是否全为非负整数
foreach ($arr as $v) {
if (!is_int($v) || $v
throw new InvalidArgumentException('Only non-negative integers are supported.');
}
}
// 获取最大值以确定位数
$max = max($arr);
$digits = $max === 0 ? 1 : (int)floor(log10($max)) + 1;
$output = $arr;
// 从个位开始,逐位排序
for ($digit = 0; $digit
$output = countingSortByDigit($output, $digit);
}
return $output;
}
// 按第 digit 位(0 表示个位,1 表示十位……)做稳定计数排序
function countingSortByDigit(array $arr, int $digit): array {
$n = count($arr);
$output = array_fill(0, $n, 0);
$count = array_fill(0, 10, 0); // 0~9 共10个桶
// 统计每个数字在该位上的频次
foreach ($arr as $num) {
$d = (int)(($num / pow(10, $digit)) % 10);
$count[$d]++;
}
// 累加计数,使 count[i] 表示 ≤ i 的元素个数(用于定位)
for ($i = 1; $i
$count[$i] += $count[$i - 1];
}
// 逆向遍历原数组,保证稳定性
for ($i = $n - 1; $i >= 0; $i--) {
$num = $arr[$i];
$d = (int)(($num / pow(10, $digit)) % 10);
$output[$count[$d] - 1] = $num;
$count[$d]--;
}
return $output;
}
// 使用示例
$nums = [170, 45, 75, 90, 2, 802, 24, 66];
$sorted = radixSort($nums);
print_r($sorted);
// 输出:[2, 24, 45, 66, 75, 90, 170, 802]
扩展建议(支持负数与浮点数)
若需支持负数,可先分离正负,对绝对值排序后合并(负数倒序);浮点数建议转为定点整数(如 ×10^k 后取整),再排序,最后还原。PHP8.2 中还可利用 array_key_first() 或 match 优化分支逻辑,但基数排序本身结构清晰,无需过度封装。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











