python与桶排序

问题提出:

将以下数据:

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代码的实现:

 1 #!/usr/bin/env python
 2 #-*- coding:utf8 -*-
 3
 4 class BucketSort(object):
 5     ‘‘‘
 6     self.datas:       要排序的数据列表
 7     self.bucketSize:  水桶的大小(数据集的范围,如bucketSize=10,
 8                       则表示数据集的范围为0-9)
 9     self.result:      保存排序后的结果
10     self.bucket:      代表水桶,指数据集内的所有元素
11     _sort():          排序函数
12     show():           输出结果的函数
13
14     用法:
15     BucketSort(datas, size)   或者BucketSort(datas),size的默认值为100
16
17     BucketSort(datas)._sort() 这样就是开始排序
18     BucketSort(datas).show()  这样就可以把排序后的结果输出
19     ‘‘‘
20     def __init__(self, datas, size=100):
21         self.datas = datas
22         self.bucketSize = size
23         self.result = [0 for i in range(len(datas))]
24         self.bucket = [0 for i in range(self.bucketSize)]
25
26     def _sort(self):
27         # 读入各个元素,并在对应的位置统计,当bucket里的元素不为0
28         # 就保存到result里面
29         for num in self.datas:
30             self.bucket[num] += 1
31         j = 0
32         for i in range(self.bucketSize):
33             while(self.bucket[i]):
34                 self.result[j] = i
35                 self.bucket[i] -= 1
36                 j += 1
37
38     def show(self):
39         print "Resutl is:",
40         for i in self.result:
41             print i,
42         print ‘‘
43
44
45 if __name__ == ‘__main__‘:
46     try:
47         size = raw_input("Please input size(default=100):")
48         if size:
49             size = int(size)
50         datas = raw_input(‘Please input some number:‘)
51         datas = datas.split()
52         datas = [int(datas[i]) for i in range(len(datas))]
53     except Exception:
54         pass
55     if size:
56         bks = BucketSort(datas, size)
57     else:
58         bks = BucketSort(datas)
59     bks._sort()
60     bks.show()



总结:

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

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

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



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

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

时间: 2024-12-21 22:37:25

python与桶排序的相关文章

计数排序、桶排序python实现

计数排序在输入n个0到k之间的整数时,时间复杂度最好情况下为O(n+k),最坏情况下为O(n+k),平均情况为O(n+k),空间复杂度为O(n+k),计数排序是稳定的排序. 桶排序在输入N个数据有M个桶时,如果每个桶的数据接近N/M个且桶内使用基于比较的排序,则桶排序的时间复杂度为O(N+M*N/M*log(N/M)).如果N=M时,每个桶只有一个数据,时间复杂度降低为O(N). 桶排序的时间复杂度为O(N+M),桶排序是稳定的排序 1.计数排序 计数排序介绍及C语言实现在:计数排序(链接) d

Python实现数据结构和算法之桶排序

桶排序 桶排序从 1956 年就开始被使用,该算法的基本思想是由E.J.Issac 和 R.C.Singleton 提出来的. 这个算法就好比有 11 个桶,编号从 0~10.每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就 OK 了.例如 2 号桶中有 1 个小旗子,表示2 出现了一次;3 号桶中有 1 个小旗子,表示 3 出现了一次;5 号桶中有 2 个小旗子,表示 5出现了两次;8 号桶中有 1 个小旗子,表示 8 出现了一次. 代码 1 def main(

桶排序算法-python实现

来源: <啊哈算法> 5个数字 5 3 5 2 8需要排序. 用到了桶排序思路 l=[0,0,0,0,0,0,0,0,0,0] p=[5,3,5,2,8] for i in range(10):     for j in p:         if i==j:             l[i]+=1 print l new_l=[] for i in range(10): #核心点在这里     if l[i]!=0:         for j in range(l[i]):        

桶排序之python实现源码

tmp = [] def bucket_sort(old): for i in range(len(old)): tmp.append([]) for i in old: tmp[int( i * len(old) )].append(i) for i in range(len(old)): #tmp[i].sort() insert_sort(tmp[i]) for i in range(len(old)): if(len(tmp[i]) > 0): print tmp[i] #test ca

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

Python实现八大排序算法

Python实现八大排序算法,具体内容如下 1.插入排序描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中. 代码实现 def insert

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

桶排序

假设现在有一组小于M的正整数 a1. a2 ,-- ,an ,对它们排序可以采用以下的思路:使用一个大小为M的数组buckets,这个数组的每一个单元称为一个个的bucket,桶,初始化全部为0.扫描数组a,当扫描到ai的时候,buckets[ai] 加1.这样当a扫描完之后,扫描buckets,打印非零单元的下标,它的值是几就打印几次.打印出来的值实际上就是排好序之后的数组a了.我们可以依次把它们赋值给a,使得a有序. 代码如下: #include<iostream> using names

基数排序(桶排序) 不同方法

详细解释:算法导论/数据结构书 1.链式基数排序 //n个数,每个数有g个关键字//排序:从最后的关键字开始到最前的关键字//分配+收集//每个关键字分配+收集需要n+n时间,而共有g个关键字,时间复杂度为O(2ng),效率很高.//如果用数组,数据集中在一个区间,则区间的长度很长,另外的区间的内存浪费了.//用链表可以解决这个问题,且数据不需要先后顺序,所以无必要非要用数组 1 #include <stdio.h> 2 #include <stdlib.h> 3 //个数 4 #