快速上手 C++ 数据结构与算法
王健伟
《C++ 新经典》系列作者,资深 C++ 讲师
3234 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
结束语 (1讲)
快速上手 C++ 数据结构与算法
15
15
1.0x
00:00/00:00
登录|注册

53|基数排序与桶排序:如何通过分配和收集进行排序?

你好,我是王健伟。
上节课我带你学习了桶思想排序中的计数排序,这节课我再带你学习一下另外两种桶思想排序——基数排序、桶排序。我们先从基数排序开始讲起。

什么是基数排序?

以往的排序主要是通过关键字的比较和记录的移动来进行。而基数排序是一种不同以往的排序方式,它并不需要进行关键字的比较。
基数排序要进行多趟排序,每趟排序都要经历“分配”和“收集”两个步骤,当然,每趟排序也都会基于上一趟排序的成果再次排序。
有这么一组数字 {516,231,445,323,299,2,18,67,42,102,164,755,687,437} 。现在希望对这组数字进行从小到大的排序。观察一下这组数字,最大的数字也就是 3 位(个位、十位、百位),所以为了更清晰地说明算法,可以把这组数字都扩展成 3 位的,比如 {516,231,445,323,299,002,018,067,042,102,164,755,687,437} 。
将关键字拆分成 d 组(上面范围每个数字都是 3 位,所以将要拆分成 3 组,即 d=3),然后按关键字位的权重递增的次序(个位、十位、百位)来做 d 趟的“分配”和“收集”动作。
因为“个位”、“十位”、“百位”数字取值都是 0~9(10 个数字)之间,所以建立 10 个辅助队列(桶)B0~B9 来保存个位、十位、百位信息。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

基数排序和桶排序是基于桶思想的排序算法,它们通过分配和收集的方式实现排序。基数排序需要进行多趟排序,每趟排序都经历分配和收集两个步骤,时间复杂度为O(d(n+k)),适用于对大量数据进行排序。而桶排序适合处理均匀分布的数据,通过划分区间成若干个大小相同的子区间,将数据放入对应的桶中,再对每个桶中的数据进行排序,最后输出结果。桶排序的时间复杂度取决于桶的数量和内部排序算法,一般为O(n+n$log_{2}^{\frac{n}{k}}$),空间复杂度为O(n+k)。桶排序的稳定性取决于对同一个桶中数据的排序算法。 基于这些特点,读者可以快速了解基数排序和桶排序的原理、适用场合以及时间、空间复杂度的分析,从而更好地理解和应用这两种排序算法。基数排序不需要进行关键字的比较,但需要进行多趟排序,每趟排序都要经历“分配”和“收集”两个步骤,每趟排序都会基于上一趟排序的成果再次排序。桶排序适合要排序的数据分布比较均匀时采用。该排序算法的稳定性取决于对同一个桶中数据的排序所采用的排序算法是否稳定。 总的来说,基数排序和桶排序都是基于桶思想的排序算法,但它们适用的场合和特点有所不同,读者可以根据具体需求选择合适的算法来进行排序。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快速上手 C++ 数据结构与算法》
新⼈⾸单¥68
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部