基数排序

基数排序#

  • 最高位优先(Most Significant Digit first)

  • MSD:先按最高位排成若干子序列,然后再对每个子序列按次高位排序。

  • 最低位优先(Least Significant Digit first)

  • LSD:先按最低位排成若干子序列,然后再对每个子序列按次低位排序。

 #

示例#

  • 对序列:321,156,57,46,28,7,331,33,34,63 进行基数排序,按照最低位优先,描述排序过程

  • 注意:关键字从桶的上方放入,桶的下方取出。

  • 第一趟:按个位

  • 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中

0123456789
  331
321
  063
033
034   046
156
007
057
028  
  • 第二趟:按十位

  • 将数从桶子下面取出,重新拼接

  • 321 331 033 063 034 156 046 057 007 028

  • 接着再进行一次分配,这次是根据十位数来分配

0123456789
007   028
321
034
033
331
046 057
156
063      
  • 第二趟:按百位

  • 将数从桶子下面取出,重新拼接

  • 007 321 028 331 033 034 046 156 057 063

  • 接着再进行一次分配,这次是根据百位数来分配

0123456789
063
057
046
034
033
028
007
156   331
321
           
  • 从桶中取出

  • 最终结果:007 028 033 034 046 057 063 156 321 331

 #

时间复杂度分析#

  • 平均和最坏情况下都是O(d(n+rd))

  • n为序列的关键字数

  • d为关键字的关键字位数,如930,由3位组成,d=3

  • rd是关键字基的个数,这里的基指构成关键字的符号,如关键字为数值时,构成关键字的符号就是0~9这些数字,一共10个

 #

空间复杂度分析#

    • 每个桶实际上是一个队列,需要头尾指针,共有rd个桶,需要2rd个存放指针的空间

    • 因此O(rd)。

posted @   BigBender  阅读(194)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示
主题色彩