Python排序算法之基数排序
目录思路时间复杂度空间复杂度代码示例思路Step1: 先按照个位分桶并且输出Step2: 再按照十位分桶并且输出Step3: 重复上述操作分桶次数由列表中最大的元素确定确定一个正整数的位数方法一:math.ceil(math.log10(max_num))方法二:str(max_num).__len__()方法三...
·
思路
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)
代码示例
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""基数排序
思路:
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:
# 创建桶
# 桶的个数是确定的,毕竟每个位数范围在[0, 9]
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)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)