桶排序及衍生

import numpy as np

import random as rd
a=[rd.randint(1,100) for i in range(10)]

a=np.random.randint(1,100,10)

print(a)
生成随机数列

基数排序
非比较型的排序算法 对数据进行分桶和合并
从数列的位数从低位到高位,进行桶排序
基数排序将数据按位进行分桶,然后将桶中的数据合并。
基数排序除了用于对整数进行排序,也可以用于对浮点数、字符串进

最高位优先 最低位优先

行排序。

p=1
while max(a)>10p:
p+=1
print(p)
for i in range(p):
bucket=[[]for i in range(10)]
for n in a:
r=n//(10
i)%10
bucket[r].append(n)
# print(bucket)
j=0
for k in range(10):
for n in bucket[k]:
a[j]=n
j+=1
print(a)

计数排序 稳定排序
是一种牺牲空间换取时间的排序算法。
计数排序先找到待排序列表中的最大值 k,开辟一个长度为 k+1 的计数列表,计数列表中的所有初始值都为 0。走访待排序列表, 如果走访到的元素值为 i,则计数列表中索引 i 的值加1,走访 完整个待排序列表,就可以统计出待排序列表中每个值的数量。 然后创建一个新列表,根据计数列表中统计的数量,依次在新列 表中添加对应数量的 i ,得到排好序的列表。
max_n=max(a)
buckets=[0]*(max_n+1)
for i in a:
buckets[i]+=1
l=[]
for i in range(len(buckets)):
for j in range(buckets[i]):
l.append(i)
print(l)

原生桶排序
分桶和合并实现
建立,大小值之间的空桶数量,分区间,依次把相应的值放进桶里,再对每个小桶进行排序
桶排序需要占用很多额外的空间,对桶内数据进行排序,选择哪种排序算法对于性能的影响至关重要。桶排序适用的场景并不多,用得多一点的是基于桶排序思想的计数排序和基数排序。
bucket_n=(max(a)-min(a))//3+1
buckets=[[] for i in range(bucket_n)]
for i in a:
buckets[int(i-min(a))//3].append(i)

print(buckets)

l=[]
for i in buckets:
for j in sorted(i):
l.append(j)
print(l)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容