python数据结构与算法——桶排序
桶排序的时间复杂度是O(M+N),通过建立对原始数据的有序统计表,实现非常快速的排序过程
可以用hashtable(或者dict)实现,查询复杂度为O(1)
贴代码:
1 # 简单桶排序 从小到大 2 def bucksort(A): 3 4 bucks = dict() # 桶 5 for i in A: 6 bucks.setdefault(i,[]) # 每个桶默认为空列表 7 bucks[i].append(i) # 往对应的桶中添加元素 8 9 A_sort = [] 10 for i in range(min(A), max(A)+1): 11 if i in bucks: # 检查是否存在对应数字的桶 12 A_sort.extend(bucks[i]) # 合并桶中数据 13 14 return A_sort
下面是运行结果:
# 对单纯整数数列进行排序 A = [2,3,5,4,6,7,3,3,0,8,5] a = bucksort(A) print a >>> [0, 2, 3, 3, 3, 4, 5, 5, 6, 7, 8]
《啊哈》中还提到了对非数字类型排序时,桶排序的应用,其思路也可以用python这样实现:
假设我们要对学生进行按分数排序:
1 # 包含其他元素的桶排序 2 # element:人名,分数 3 class Person: 4 def __init__(self,name,score): 5 self.name = name 6 self.score = score 7 def __repr__(self): # 覆写打印输出 print Person() 8 return self.name + "-" + str(self.score) 9 10 11 def bucksort2(A): 12 bucks = dict() 13 for a in A: 14 bucks.setdefault(a.score,[]) # 以个人分数为评价排列标准 15 bucks[a.score].append(a) # 在相同分数的桶中添加人 16 17 A_sort = [] 18 scorelist = [a.score for a in A] # 将人员列表中所有人的分数取出 19 for i in range(min(scorelist), max(scorelist)+1): 20 if i in bucks: 21 A_sort.extend(bucks[i]) 22 23 return A_sort
输出结果:
# 对人进行排序 B = [Person('huhu',5),Person('haha',3),Person('xixi',5),Person('hengheng',2),Person('gaoshou',8)] b = bucksort2(B) print b >>> [hengheng-2, haha-3, huhu-5, xixi-5, gaoshou-8]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用