JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序 (4)

第三,基数排序的时间复杂度是多少 ?
最佳情况:T(n) = O(n * k)
最差情况:T(n) = O(n * k)
平均情况:T(n) = O(n * k)
k 是待排序列最大值。

动画

LSD 基数排序动图演示:

5. 解答开篇

回过头来看看开篇的思考题:如何根据年龄给 100 万用户排序 ?

你可能会说,我用上一节讲的归并、快排就可以搞定啊!是的,它们也可以完成功能,但是时间复杂度最低也是 O(nlogn)。

有没有更快的排序方法呢 ?以下是参考答案。

实际上,根据年龄给 100 万用户排序,就类似按照成绩给 50 万考生排序。

我们假设年龄的范围最小 1 岁,最大不超过 120 岁。

我们可以遍历这 100 万用户,根据年龄将其划分到这 120 个桶里,然后依次顺序遍历这 120 个桶中的元素。

这样就得到了按照年龄排序的 100 万用户数据。

6. 复杂性对比

基数排序 vs 计数排序 vs 桶排序

基数排序有两种方法:

MSD 从高位开始进行排序

LSD 从低位开始进行排序

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

基数排序:根据键值的每位数字来分配桶;

计数排序:每个桶只存储单一键值;

桶排序:每个桶存储一定范围的数值;

复杂性对比

名称 平均 最好 最坏 空间 稳定性 排序方式
桶排序   O(n + k)   O(n + k)   O(n2)   O(n + k)   Yes   Out-place  
计数排序   O(n + k)   O(n + k)   O(n + k)   O(k)   Yes   Out-place  
基数排序   O(n * k)   O(n * k)   O(n * k)   O(n + k)   Yes   Out-place  

n: 数据规模

桶排序的时间复杂度可以是多种情况的,取决于桶内的排序。

7. 最后

文中所有的代码及测试事例都已经放到我的 GitHub 上了。

觉得有用 ?喜欢就收藏,顺便点个赞吧,你的支持是我最大的鼓励!

参考文章:

菜鸟教程 - 算法系列

线性排序:如何根据年龄给100万用户数据排序?

十大经典排序算法总结(JavaScript 描述)

JS 中可能用得到的全部的排序算法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzfy.html