基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
基数排序 vs 计数排序 vs 桶排序:这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
- 基数排序:根据键值的每位数字来分配桶;
- 计数排序:每个桶只存储单一键值;
- 桶排序:每个桶存储一定范围的数值;
代码:
<?php
function radix_sort($arr = [], $radix = 10)
{
$buckets = [];
$max = get_max($arr);
$base = 0;
while ($max > 1) {
for ($i = 0; $i < $radix; $i++) {
$buckets[$i] = []; // 重新初始化$buckets
}
foreach ($arr as $val) {
$index = ($val / pow($radix, $base)) % $radix; // 获取当期位置余数
$buckets[$index][] = $val;
}
$arr = [];
// 把$buckets里的数据倒出来赋给$arr
foreach ($buckets as $bucket) {
foreach ($bucket as $val) {
$arr[] = $val;
}
}
$base++;
$max /= $radix;
}
return $arr;
}
function get_max($arr = [])
{
$arr_len = count($arr);
if (empty($arr)) {
return -1; // 根据情况设置,假设排序的都是正数
}
$max = $arr[0];
for ($i = 1; $i < $arr_len; $i++) {
if ($max < $arr[$i]) {
$max = $arr[$i];
}
}
return $max;
}
// $arr = [13, 1, 5, 99, 234, 23, 33];
$arr = [3, 34, 443, 123, 2, 1, 543, 19, 234, 944];
$arr = radix_sort($arr);
print_r($arr);
输出:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 19
[4] => 34
[5] => 123
[6] => 234
[7] => 443
[8] => 543
[9] => 944
)