python数据结构与算法——桶排序

摘要:
34bucks=dict()#Bucket 5foriinA:[])#默认情况下,每个Bucket都是空列表。7桶[i]。append(i)#将元素89A添加到对应的bucket_Sort=[]10foriinrange(min(A),max(A)+1):#排序简单整数序列A=[2,5]A=bucksort(A)printa>分数):

桶排序的时间复杂度是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]

免责声明:文章转载自《python数据结构与算法——桶排序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]“在CMD下面执行命令需要加上exe后缀才能执行“的解决方案1 MySQL优化专题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS敏捷开发之道,经常使用的宏定义总结

iOS开发中,直接在pch文件里导入宏定义。 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度。 以下是 个人总结的一些宏定义。 假设大家有其它的经常使用的宏定义。欢迎加入。我会定期更新这个blog….. 话不多说,直接上干货 // 在宏的參数前加上一个#。宏的參数会自己主动转换成c语言的字符串 #define MRKeyPath(objc,ke...

C# PDF文件转图片

1、使用的插件O2S.Components.PDFRender4NET public enum Definition { One = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10 }...

内核如何启动根文件系统?

当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段。与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了。本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程。第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式、使能MMU、...

关于 Nginx 配置的一些疑惑, Nginx 根据cookie 进行rewrite

网站目录结构如下:/public/en.html/public/zh_cn.html/public/index.php 之前所有的非静态资源请求都交给 index.php现在要把首页的请求 不走PHP了,提高下网站性能。Nginx会根据cookie值 lang=en 直接返回en.html 根据 lang=zh_cn 直接返回 zh_cn.html。如果没...

Google 74版本上传附件没有“选择文件”按钮

这是因为flash插件权限受到限制,需要修改注册表,才能将允许运行Flash的网站名单加入进去。 新建adobe-flash-player.reg注册表文件,将下面内容复制到文件中(使用notepad打开,注意编码问题)。 Windows Registry Editor Version 5.00[HKEY_CURRENT_USERSOFTWAREPoli...

vue 点击展开显示更多 点击收起部分隐藏

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <style ty...