计数排序 (Counting Sort)

/**
 * @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,不可重复,但可通过映射关系进行计数

适用场景
  • 已知待排序数组范围

  • 对重复性数据较多,范围较小的排序友好(如全校学生身高)

实现
  • 初始化桶

  • 入桶(待排序数组-》桶)

  • 出桶(桶-》待排序数组)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值