/**
* @param $arr array 已知$arr为[0, $maxValue]
* @param $maxValue
* @return array
*/
function CountSort($arr, $maxValue = null): array {
$bucket = [];
$maxValue = $maxValue ? $maxValue : max($arr);
for ($i = 0; $i < $maxValue; $i++) {
$bucket[$i] = 0;
}
foreach ($arr as $k => $v) {
$bucket[$v]++;
}
$i = 0;
foreach ($bucket as $k => $v) {
while ($v--) {
$arr[$i++] = $k;
}
}
return $arr;
}

计数排序(Counting sort)是一种稳定的线性时间(时间复杂度与待排序数组大小成正相关关系)排序算法。
与基数排序的区别
两者都用到了“桶”
与java的数据结构对比,基数排序像Set,可重复,但没有映射关 系,计数排序像Map,不可重复,但可通过映射关系进行计数
适用场景
已知待排序数组范围
对重复性数据较多,范围较小的排序友好(如全校学生身高)
实现
初始化桶
入桶(待排序数组-》桶)
出桶(桶-》待排序数组)