基数排序
基数排序(也叫桶排序)是一种很特别的排序方法,它不是基于比较进行排序的,而是采用多关键字排序思想(即基于关键字各位的大小进行排序的),借助“分配”和“收集”两种操作对单逻辑关键字进行排序。基数排序又分为最高位优先(MSD)排序和最低位优先(LSD)排序
分析
LSD
MSD
#代码实现
LSD
```
from random import randint
def RadixSort(list, d):
for k in range(d): #d是列表内数字的最大位数, 易知需进行d轮排序
s = [[] for i in range(10)] #建立0-9十个桶
for i in list:# 分配 收集
s[i // (10**k) % 10].append(i)
print(s)
print('*****************')
list = [j for i in s for j in i]
return list #有序列表
a = [53, 3, 542, 748, 14, 214, 154, 63, 616]
a = RadixSort(a, 3)
print(a)
```
MSD
```
未完待续
```
总结
-
关键字数量为n,关键字的位数为d,比如748 d=3,r为关键字的基的个数,就是组成关键字的数据的种类,比如十进制数字一共有0至9一共10个数字,即r=10
-
空间复杂度:需要开辟关键字基的个数个队列,所以空间复杂度为O®
-
时间复杂度:需要进行关键字位数d次"分配"和"收集",一次"分配"需要将n个关键字放进各个队列中,一次"收集"需要将r个桶都收集一遍。所以一次"分配"和一次"收集"时间复杂度为O(n+r)。d次就需要O(d(n+r))的时间复杂度
-
稳定性:由于是队列,先进先出的性质,所以在分配的时候是按照先后顺序分配,也就是稳定的,所以收集的时候也是保持稳定的。即基数排序是稳定的排序算法