/**
* 基数排序
* @param array $arr
* @param int $m 数字的最大位数
* @param int $d 几进制的数,也是桶的个数
*/
function radix($arr,$m,$d)
{
$n = count($arr);
if($n<2) return $arr;
//用数组表示队列,$d进制就有$d个队列,也就是多少个桶,初始化
for ($i=0;$i<$d;$i++) {
$queue[$i]=[];
}
//从最低位开始放入对应的队列/桶内
for ($j =0;$j<$m;$j++) {
$power = $j?$power*$d:1;
for ($i=0; $i<$n;$i++) {
//根据当前位的数据求属于哪个队列、桶就放哪个队列去
$k = floor($arr[$i]/$power)-floor($arr[$i]/($d*$power))*$d;
$queue[$k][]=$arr[$i];
}
//放完后,从桶内取出,就是一次排序后的结果
$tmp = [];
for ($p =0;$p<$d;$p++) {
while ($queue[$p]) {
$tmp[]=array_shift($queue[$p]);
}
}
$arr = $tmp;
}
return $tmp;
}
$arr = [91,27,94,32,69,88,51,29,11,10,111];
$res = radix($arr,3,10);
print_r($res);