CS61B 课程笔记(Lecture 36 Radix Sorts)
CS61B 课程笔记(Lecture 36 Radix Sorts)
1. 背景介绍
- 排序问题的下界:基于比较的排序算法在最坏情况下需要进行 \(Ω(N \log N)\) 次比较操作,这也是归并排序的最坏运行时间。
- 问题引入:但如果我们不做任何比较呢?可以使用 非比较排序算法 实现更快的排序。
2. 计数排序(Counting Sort)
- 计数排序思想:
- 创建一个新数组,用来记录每个元素出现的次数。
- 根据出现次数将原数组中的元素放入正确的位置。
- 时间复杂度:计数排序可以在 \(Θ(N)\) 时间内完成排序,适用于整数范围较小、值唯一且连续的情况。
3. 最低有效位基数排序(LSD Radix Sort)
- 基本思想:从最低位(右侧)开始,逐位对数字进行排序,每次排序使用计数排序作为子过程。
- 过程:
- 首先对所有数的最低位进行排序。
- 然后对第二低位进行排序,保持前一位排序的稳定性。
- 依次向左处理,直到所有位都排序完成。
- 运行时间:LSD基数排序的运行时间为 \(Θ(WN + WR)\),其中:
- \(N\) 为元素的数量,
- \(W\) 为数字的位数或字符长度,
- \(R\) 为基数(例如,十进制数的基数为 \(10\))。
- 适用场景:适用于所有键长度相同的情况,尤其在极大数据量下表现出色。
4. 最高有效位基数排序(MSD Radix Sort)
- 基本思想:与LSD相反,从最高位(左侧)开始逐位排序,每次将数据分组,然后在每个分组内部递归进行排序。
- 过程:
- 对数据的最高位进行排序,将数据分组。
- 然后对每个分组按照下一位递归进行排序。
- 直到所有位都排序完成。
- 最佳情况:在最理想的情况下,只需查看最高位即可完成排序,时间复杂度为 \(Θ(N + R)\)。
- 最坏情况:最坏情况下,MSD基数排序会退化为LSD排序,运行时间仍为 \(Θ(WN + WR)\)。
5. 适用场景与对比
- LSD vs. MSD:
- LSD排序:适合长度相同、字符差异较小的字符串。
- MSD排序:适合长度不相等的字符串。
- LSD vs. 比较排序:
- 对于非常大的数据集,LSD排序更优,尤其是当 N 极大时。
- 对于很短且字符差异大的字符串,比较排序(如快速排序)通常更高效,因为 $ N$ 通常较小。
6. 术语总结
- 基数(Radix):指数字系统的基数,例如十进制数的基数为$ 10\(,字母表的基数为\) 26$。
- 基数排序(Radix Sort):逐位对数据进行排序的一种排序方法。
- 计数排序(Counting Sort):通过计数并直接放置元素的位置来完成排序的算法,通常用于基数排序的子过程。
- LSD排序:从最低有效位开始逐位排序。
- MSD排序:从最高有效位开始逐位排序。
7. 总结
- 基数排序是一种非比较排序算法,能够打破基于比较排序的时间下界 \(Ω(N \log N)\)。
- 计数排序是基数排序的核心子过程,它能够在线性时间 \(Θ(N + R)\) 内完成排序,适用于键值较小的整数集合。
- LSD和MSD基数排序各有优势,适用于不同类型的数据。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论