排序算法专题之桶排序
Posted Python算法之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法专题之桶排序相关的知识,希望对你有一定的参考价值。
我们知道基于比较的排序算法的最好的情况的时间复杂度是O(nlgn),然而存在一种神奇的排序算法,不是基于比较的,而是空间换时间,使得时间复杂度能够达到线性O(n+k),这种算法就是本文将要介绍桶排序(其实也不是真正的桶排序,倒有点像计数排序)
扫码加入“Python算法之旅”微信群,和斌哥面对面交流,更多资料和更有趣的话题等你一起来分享。
排序算法专题之桶排序
1.桶排序思想
描述:小王想对浙江省30万考生的技术成绩进行降序排序,成绩为0到100之间的整数。由于人数较多,使用选择,冒泡,插入等简单排序算法效率实在太低,是否有更高效的方法?
算法分析:因为待排序的成绩为0到100之间的整数,所以可以使用桶排序。
桶排序算法分为三个步骤:把桶清空,把数据装入对应桶中和依次把数据从桶里倒出来。
假设我们把成绩存储在列表a中。可以设置一个长度为101的列表b,表示总共有101个桶,它的下标0-100就是各个桶的编号。
第一步:把桶清空,即初始化列表b的值均为0。
第二步:把数据装入对应桶中,即累计列表b各元素的值。例如,若出现a[i] = 80,则b[80] += 1;若最终考80分的学生有10000名,则b[80] = 10000。
第三步:依次把数据从桶里倒出来,即逆序遍历列表b,从高到低依次输出成绩。若b[i] = k,则表示成绩为i的学生总共有k个,需要将成绩i输出k次。
例题1.使用桶排序算法对列表a排序,列表为0到100之间的整数。
函数名:bucket_sort(a)
参数表:a -- 待排序列表,其元素值为0到100之间的整数。
返回值:该方法没有返回值,但是会对列表进行升序排序。
def bucket_sort(a):
b = [0] * 101 #把桶清空
for num in a: #把数据装入对应桶中
b[num] += 1
k = 0
for i in range(101): #依次把数据从桶里倒出来
a[k:k+b[i]] = [i] * b[i] #存储所有值为i的元素
k += ①
2. 桶排序应用
例2.小王用计算机生成了10万个1000到1100之间随机整数,请对这些数据进行“去重”和“升序排序”的工作。
函数名:duplicate_removal_sort(t):
参数表:t -- 元组,其元素值为1000到1100之间的随机整数。
返回值:一个列表,存储了对元组进行“去重”和“升序排序”后的元素。
示例:对于t=(1095, 1036, 1095, 1036, 1026, 1036),返回a=[1026, 1036, 1095]
def duplicate_removal_sort(t):
#把桶清空,因为数据范围是[1000,1100],故只需101个桶
b = [0] * 101
for num in t: #把数据装入对应桶中
b[① ] += 1
a = []
for i in range(101): #依次把数据从桶里倒出来
if b[i] > 0:
a.append(② )
return a
1.桶排序思想
描述:小王想对浙江省30万考生的技术成绩进行降序排序,成绩为0到100之间的整数。由于人数较多,使用选择,冒泡,插入等简单排序算法效率实在太低,是否有更高效的方法?
算法分析:
因为待排序的成绩为0到100之间的整数,所以可以使用桶排序。
桶排序算法分为三个步骤:把桶清空,把数据装入对应桶中和依次把数据从桶里倒出来。
假设我们把成绩存储在列表a中。可以设置一个长度为101的列表b,表示总共有101个桶,它的下标0-100就是各个桶的编号。
第一步:把桶清空,即初始化列表b的值均为0。
第二步:把数据装入对应桶中,即累计列表b各元素的值。例如,若出现a[i] = 80,则b[80] += 1;若最终考80分的学生有10000名,则b[80] = 10000。
第三步:依次把数据从桶里倒出来,即逆序遍历列表b,从高到低依次输出成绩。若b[i] = k,则表示成绩为i的学生总共有k个,需要将成绩i输出k次。
例题1.使用桶排序算法对列表a排序,列表为0到100之间的整数。
函数名:bucket_sort(a)
参数表:a -- 待排序列表,其元素值为0到100之间的整数。
返回值:该方法没有返回值,但是会对列表进行升序排序。
def bucket_sort(a):
b = [0] * 101 #把桶清空
for num in a: #把数据装入对应桶中
b[num] += 1
k = 0
for i in range(101): #依次把数据从桶里倒出来
a[k:k+b[i]] = [i] * b[i] #存储所有值为i的元素
k += b[i]
2.桶排序应用
例2.小王用计算机生成了10万个1000到1100之间随机整数,请对这些数据进行“去重”和“升序排序”的工作。
函数名:duplicate_removal_sort(t):
参数表:t -- 元组,其元素值为1000到1100之间的随机整数。
返回值:一个列表,存储了对元组进行“去重”和“升序排序”后的元素。
示例:对于t=(1095, 1036, 1095, 1036, 1026, 1036),返回a=[1026, 1036, 1095]
def duplicate_removal_sort(t):
#把桶清空,因为数据范围是[1000,1100],故只需101个桶
b = [0] * 101
for num in t: #把数据装入对应桶中
b[num-1000] += 1
a = []
for i in range(101): #依次把数据从桶里倒出来
if b[i] > 0:
a.append(i+1000)
return a
Python排序算法系列文章是我在阅读了大量算法专著以后,尝试用浅陋的语言把自己的理解表达出来。由于本人水平有限,表述中难免出现疏漏甚至错误之处,敬请谅解。
无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!
需要本文word版的,可以加入“选考VB算法解析”知识星球参与讨论和下载文件,“选考VB算法解析”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。
我们专注选考VB算法,感兴趣就一起来!
相关优秀文章:
以上是关于排序算法专题之桶排序的主要内容,如果未能解决你的问题,请参考以下文章