算法子目录:https://www.jianshu.com/p/02492be3c5f5
![](https://img.haomeiwen.com/i20155953/f1fa8aea1cccad3b.gif)
思路
基数排序的原理就是按照将每个元素的从低到高的顺序依次取出各位上的元素,然后每次按照取出的元素进行归类和重整。直到所有的位数都排完。简单的将就是先拆分后整合。这里并不能先排第一位,那样最后依然是无序。
代码
import random
from cat_time import cal_time
@cal_time
def radix_sort(nums):
mod = 10
div = 1
mostBit = len(str(max(nums))) # 最大数的位数决定了外循环多少次
buckets = [[] for row in range(mod)] # 构造 mod 个空桶
while mostBit:
for num in nums: # 将数据放入对应的桶中
buckets[num // div % mod].append(num)
i = 0 # nums 的索引
for bucket in buckets: # 将数据收集起来
while bucket:
nums[i] = bucket.pop(0) # 依次取出
i += 1
div *= 10
mostBit -= 1
return nums
li = list(range(10000))
random.shuffle(li)
radix_sort(li)
总结
基数排序本质上时桶排序的一次应用。
平均时间复杂度:O(nk)
最坏时间复杂度:O(nk)
空间复杂度:O(n+k)
是一种稳定排序。
网友评论