算法之排序算法——桶排序
一、基本思想
划重点:划分多个范围相同的区间,每个区间自排序,最后合并。
桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素。
桶排序保证每个桶存储一定范围,通过映射函数,将待排序数组中的元素映射到各个对应的桶中。
取值范围要合理保证元素分布均匀。
对每个桶中的元素进行排序,最后将桶合并,完成有序排列。
二、图解过程
a、待排序序列
b、划分到五个桶
c、桶里自排序
d、合并,完成有序序列
三、核心代码
#待排序序列
list = [24,5,37,52,69,55,8,6,44,53]
#划五个桶
bucket=[[],[],[],[],[]]
#划分到五个桶
for i in list:
if i >0 and i <= 20:
bucket[0].append(i)
elif i >20 and i <= 40:
bucket[1].append(i)
elif i >40 and i <= 60:
bucket[2].append(i)
elif i >60 and i <= 80:
bucket[3].append(i)
elif i >80 and i <= 100:
bucket[4].append(i)
result=[]
#桶内自排序并合并,现简化用list.sort()方法
#一般用快速排序法
for i in bucket:
i.sort()
result = result+i
#完成
print(result)
#输出
[5, 6, 8, 24, 37, 44, 52, 53, 55, 69]
四、复杂度分析
1. 时间复杂度:O(N + M)
对于待排序序列大小为 N,共分为 M 个桶
当使用快速排序算法,平均时间复杂度:
O(N)+O(M∗(N/M∗log(N/M)
2. 空间复杂度:O(N + M)
五、稳定性分析
桶排序的稳定性取决于桶内排序使用的算法。