啊哈算法——第一章第一节:桶排序

       学习算法不奇怪,啊哈算法很哇塞!大家好,我是pythonitstream。今天我们来讲一下啊哈磊(原名纪磊)写的《啊哈算法》一书


目录

前言

一、桶排序是什么

二、实战应用

二、(1)、分析

二、(2)、代码

总结


前言

       有一个困扰了我们多年的问题,就是如何排序。这听起来挺简单,但是从时间复杂度的角度上就不那么简单了。


一、桶排序是什么

桶排序是一个简单又快捷的排序,时间复杂度仅为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个值的列表?请看下期——冒泡排序

猜你喜欢

转载自blog.csdn.net/pythonitstream/article/details/124645046