学习算法不奇怪,啊哈算法很哇塞!大家好,我是pythonitstream。今天我们来讲一下啊哈磊(原名纪磊)写的《啊哈算法》一书
前言
有一个困扰了我们多年的问题,就是如何排序。这听起来挺简单,但是从时间复杂度的角度上就不那么简单了。
一、桶排序是什么
桶排序是一个简单又快捷的排序,时间复杂度仅为O(N+M),是不是很快?
它的原理就是用一个列表,只要有一个数出现,就把相应索引值的值加一。等到打印的时候,再用一个循环,判断一下,如果值为0,那就不打印,否则打印那个数
二、实战应用
有一个班想让我们排序一下分数,他们的分数分别是65,99,81,79,100和94,那该怎么办呢?
二、(1)、分析
首先,分数是由大到小排序,并且满分是100分,所以创建一个大小为101的列表就可以了,这个列表就是那个“桶”。实践如下:
a=[0 for i in range(101)]
其次,读入数,搞一个循环,用来统计数。每当用户输入一个数时,对应的桶的索引值的值加一
。就是酱紫:
for j in range(6): #输入六个数
result=int(input('请输入成绩:'))
a[result]+=1 #相应的索引值的值加一
然后就是打印。打印时,要用一个嵌套循环。一个用来遍历桶,一个用来打印数字(桶里的值是多少,就打印多少遍)。因为我们是从大到小排序,所以我们要从6到0的range。实现如下:
for k in range(100,-1,-1): #从6到1的range
for l in range(1,a[k]+1): #打印数
print(k,end=' ')
二、(2)、代码
代码实现是酱紫的:
a=[0 for i in range(101)] #那个“桶”
for j in range(6): #输入六个数
result=int(input('请输入成绩:'))
a[result]+=1 #相应的索引值的值加一
for k in range(100,-1,-1): #从6到1的range
for l in range(1,a[k]+1): #打印数
print(k,end=' ')
请输入成绩:65
请输入成绩:99
请输入成绩:81
请输入成绩:79
请输入成绩:100
请输入成绩:94
100 99 94 81 79 65
总结
桶排序速度很快,但是也有弊端。
如果让你统计5.25这种小数怎么办?如果数是1 10000000 999 254325323呢?你是不是要做一个254325324个值的列表?请看下期——冒泡排序