zoukankan      html  css  js  c++  java
  • 基数排序

    基数排序

    • 最高位优先(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)。

  • 相关阅读:
    关于Tomcat的那些事儿(一)
    关于Spring的问题(一)
    关于Spring的@RequestBody的使用
    关于Eclipse切换所有分支
    关于使用BetterIntelliJ激活IntelliJ IDEA
    关于Elasticsearch的问题(一)
    关于Elasticsearch那些事
    关于LRU算法及Java实现
    自定义滚动条
    创建型模式之建造者模式
  • 原文地址:https://www.cnblogs.com/YC-L/p/13393719.html
Copyright © 2011-2022 走看看