function radixSort(array $arr) : array {
$times = 1;
$has = true;
while ($has) {
$has = false;
$buff = [];
foreach ($arr as $k => $v) {
$radix = (int)($v / $times) % 10;
// 入桶,归类
$buff[$radix][] = $v;
// 判断是否需要下次循环
if ((int)($v / $times / 10) % 10 > 0) {
$has = true;
}
}
// php数组特点,需根据索引对数组重排序
array_multisort($buff, SORT_ASC, SORT_NUMERIC, array_keys($buff));
$i = 0;
// 出桶
array_walk_recursive($buff, function ($v, $k) use (&$i, &$arr) {
$arr[$i++] = $v;
});
$times *= 10;
}
return $arr;
}
/**
* 对桶进行初始化,这样就免去了重排序的工作
* @param array $arr
* @return array
*/
function radixSort1(array $arr) : array {
$times = 1;
$has = true;
while ($has) {
$has = false;
$buff = [[], [], [], [], [], [], [], [], []];
foreach ($arr as $k => $v) {
$radix = (int)($v / $times) % 10;
// 入桶,归类
$buff[$radix][] = $v;
// 判断是否需要下次循环
if ((int)($v / $times / 10) % 10 > 0) {
$has = true;
}
}
// php数组特点,需根据索引对数组重排序
// array_multisort($buff, SORT_ASC, SORT_NUMERIC, array_keys($buff));
$i = 0;
// 出桶
array_walk_recursive($buff, function ($v, $k) use (&$i, &$arr) {
$arr[$i++] = $v;
});
$times *= 10;
}
return $arr;
}