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]

 

posted on   hanahimi  阅读(574)  评论(0编辑  收藏  举报

编辑推荐:
· 深入理解 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 构建精确任务处理应用

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示