基数排序(桶子排序)
- 最高位优先(Most Significant Digit first) 
- MSD:先按最高位排成若干子序列,然后再对每个子序列按次高位排序。 
- 最低位优先(Least Significant Digit first) 
- LSD:先按最低位排成若干子序列,然后再对每个子序列按次低位排序。 
示例
- 对序列:321,156,57,46,28,7,331,33,34,63 进行基数排序,按照最低位优先,描述排序过程 
- 注意:关键字从桶的上方放入,桶的下方取出。 
- 第一趟:按个位 
- 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
|---|---|---|---|---|---|---|---|---|---|
| 331 321 | 063 033 | 034 | 046 156 | 007 057 | 028 | 
- 第二趟:按十位 
- 将数从桶子下面取出,重新拼接 
- 321 331 033 063 034 156 046 057 007 028 
- 接着再进行一次分配,这次是根据十位数来分配 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
|---|---|---|---|---|---|---|---|---|---|
| 007 | 028 321 | 034 033 331 | 046 | 057 156 | 063 | 
- 第二趟:按百位 
- 将数从桶子下面取出,重新拼接 
- 007 321 028 331 033 034 046 156 057 063 
- 接着再进行一次分配,这次是根据百位数来分配 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
|---|---|---|---|---|---|---|---|---|---|
| 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)。 
