问题提出:

将以下数据:

6, 8, 2, 3, 4, 0, 9, 1, 5,1

按从小到达排列。


桶排序原理:

桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现的次数。最后按顺序输出数据集里面的元素。

排序过程如下:

一、初始化桶的大小

把数据集里面每一个元素当作一个桶,由上面问题看出,原始数据范围在0--9之间,因此我就需要有10个桶,如下图

第一行为初始化计数为0,第二行为各个元素。

二、计数

接下来读入第一原始数据为6,则在下标为6的桶中增加1,如下图:

再读入下一个原始数据为8,则在下标为8的桶中增加1,如下图:

以此类推,最后遍历完所有原始数据时,10个桶的计数如下图:

三、输出数据

在完成原始数据的遍历计数后,接下来遍历各个桶,输出数据:

元素0计数为1,则输出0,

元素1计数为2,则输出1 1,

元素2计数为1,则输出2,

元素3计数为1,则输出3,

元素4计数为1,则输出4,

元素5计数为1,则输出5,

元素6计数为1,则输出6,

元素7计数为0,则不输出元素,

元素8计数为1,则输出8,

元素9计数为1,则输出9,

最后结果输出为:0, 1, 1, 2, 3, 4, 5, 6, 8, 9


代码实现

由上述原理可以看出,桶排序需要以下三个步骤:

1.申请一个包含所有元素的数组,并初始化。

2.遍历原始数据,并计数。

3.遍历计数完成后的各个数组元素,输出数据。

以下是python代码的实现:

 #!/usr/bin/env python
#-*- coding:utf8 -*- class BucketSort(object):
'''
self.datas: 要排序的数据列表
self.bucketSize: 水桶的大小(数据集的范围,如bucketSize=10,
则表示数据集的范围为0-9)
self.result: 保存排序后的结果
self.bucket: 代表水桶,指数据集内的所有元素
_sort(): 排序函数
show(): 输出结果的函数 用法:
BucketSort(datas, size) 或者BucketSort(datas),size的默认值为100 BucketSort(datas)._sort() 这样就是开始排序
BucketSort(datas).show() 这样就可以把排序后的结果输出
'''
def __init__(self, datas, size=100):
self.datas = datas
self.bucketSize = size
self.result = [0 for i in range(len(datas))]
self.bucket = [0 for i in range(self.bucketSize)] def _sort(self):
# 读入各个元素,并在对应的位置统计,当bucket里的元素不为0
# 就保存到result里面
for num in self.datas:
self.bucket[num] += 1
j = 0
for i in range(self.bucketSize):
while(self.bucket[i]):
self.result[j] = i
self.bucket[i] -= 1
j += 1 def show(self):
print "Resutl is:",
for i in self.result:
print i,
print '' if __name__ == '__main__':
try:
size = raw_input("Please input size(default=100):")
if size:
size = int(size)
datas = raw_input('Please input some number:')
datas = datas.split()
datas = [int(datas[i]) for i in range(len(datas))]
except Exception:
pass
if size:
bks = BucketSort(datas, size)
else:
bks = BucketSort(datas)
bks._sort()
bks.show()

总结:

1.桶排序的优点就是特别快,真的是特别快!特别快!特别块!

2.缺点就是特别耗资源,如果数据取值的范围是0---1010, 就要申请一个大小为1010的数组,想想这得多耗内存空间。阔怕!

3.我上面写的程序也只是一个演示性的,漏洞挺多,目前只能排序大于零的整数。


最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*

扫码关注或者搜索微信号:King_diary

python与桶排序的更多相关文章

  1. python实现桶排序算法

    桶排序算法也是一种可以以线性期望时间运行的算法,该算法的原理是将数组分到有限数量的桶里,每个桶再分别排序. 它的算法流程如下所示: 设置一个定量的数组当作空桶子. 寻访序列,并且把项目一个一个放到对应 ...

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

    桶排序的时间复杂度是O(M+N),通过建立对原始数据的有序统计表,实现非常快速的排序过程 可以用hashtable(或者dict)实现,查询复杂度为O(1) 贴代码: # 简单桶排序 从小到大 def ...

  3. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  4. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  5. python 排序 桶排序

    算法思想: 桶排序将数组分到有限数量的桶里.然后每个桶里再分别排序(使用任何算法) 当要倍排序的数组内的数值时均匀分配的时候,桶排序使用线性时间O(n) 步骤: 根据最大值.最小值.桶内数据范围设定一 ...

  6. Python线性时间排序——桶排序、基数排序与计数排序

    1. 桶排序 1.1 范围为1-M的桶排序 如果有一个数组A,包含N个整数,值从1到M,我们可以得到一种非常快速的排序,桶排序(bucket sort).留置一个数组S,里面含有M个桶,初始化为0.然 ...

  7. 桶排序之python实现源码

    tmp = [] def bucket_sort(old): for i in range(len(old)): tmp.append([]) for i in old: tmp[int( i * l ...

  8. Python 数据结构与算法——桶排序

    #简单的桶排序 def bucksort(A): bucks = dict() # 定义一个桶变量,类型为字典 for i in A: bucks.setdefault(i,[]) # 每个桶默认为空 ...

  9. 计数排序、桶排序python实现

    计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个 ...

随机推荐

  1. JAM计数法(模拟)

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  2. OC-文件操作

    一.归档NSKeyedArchiver========================== 1.第一种方式:存储一种数据.===================== //归档 //第一种写法 //对象 ...

  3. Markdown速成班

    更多内容请参考: http://ibruce.info/2013/11/26/markdown/

  4. Java进阶知识点4:不可变对象与并发 - 从String说起

    一.String的不可变特性 熟悉Java的朋友都知道,Java中的String有一个很特别的特性,就是你会发现无论你调用String的什么方法,均无法修改this对象的状态.当确实需要修改Strin ...

  5. 创建Oracle数据库需要注意的几点

    规划表和存储空间,防止出现空间不足或者空间的浪费 规划快速恢复区,将快速恢复区定义在与数据文件不同的存储区域,减少IO争用 规划数据库的名称,db_name,db_main,sid 规划spfile内 ...

  6. Java JDK安装和配置(Windows)

    安装和配置JDK JDK中自带了JRE,不需要单独下载, 打开JDK安装, 选择安装目录,下一步,装完JDK,会问是否安装JRE,选下一步, 最后还会问是否安装Java FX, 装完后就全部完成了JD ...

  7. js客户端UI框架

    Best jQuery UI http://b-jui.com/ jQuery EasyUI http://www.jeasyui.com/ bootstrap学习网: http://www.runo ...

  8. c&c++ datetime

    时间函数之间的关系 struct tm { int tm_sec; // 代表目前秒数,正常范围0-59,但允许至61秒: int tm_min; // 代表目前分数,范围为0-59. int tm_ ...

  9. ①HttpURLConnection通过报文提交

    在进行短信发送的接口,因厂家不同,有的厂家会采用报文的格式进行短信请求的发送与接收.本文主要介绍利用HttpURLConnection进行短信报文的请求与响应. 一般的url请求分为两种,一种是GET ...

  10. wordpress改不了固定连接的解决办法

    经常遇到更改了固定连接刷新没效果>>>>>>>废话不多说直接上步骤,有图有真相. 1,ftp删除根目录的这个文件夹 2,进入wp后台设置-固定连接—自定义结构 ...