思路
Step1: 先按照个位分桶并且输出
Step2: 再按照十位分桶并且输出
Step3: 重复上述操作
分桶次数由列表中最大的元素确定
确定一个正整数的位数
方法一:math.ceil(math.log10(max_num))
方法二:str(max_num).__len__()
方法三:
it = 0;
while 10 ** it <= max_num:
it += 1
时间复杂度
O(kn) k为位数
空间复杂度
O(k + n)
代码示例
"""基数排序
思路:
Step1: 先按照个位分桶并且输出
Step2: 再按照十位分桶并且输出
Step3: 重复上述操作
分桶次数由列表中最大的元素确定
确定一个正整数的位数
方法一:math.ceil(math.log10(max_num))
方法二:str(max_num).__len__()
方法三:
it = 0;
while 10 ** it <= max_num:
it += 1
(线性)时间复杂度:O(kn) k为位数
空间复杂度:O(k + n)
"""
import random
def radix_sort(ls):
"""基数排序
Args:
:param ls: list, 待排序的列表
"""
max_num = max(ls)
it = 0
while 10 ** it <= max_num:
buckets = [[] for _ in range(10)]
for item in ls:
pos = item // 10 ** it % 10
buckets[pos].append(item)
ls.clear()
for buc in buckets:
ls.extend(buc)
it += 1
ls = [random.randint(0, 10000) for _ in range(1000)]
random.shuffle(ls)
radix_sort(ls)
print(ls)