以下内容是个人学习笔记的整理。
原理:
将待排序的数据分到几个有序的桶里,每个桶的数据单独排序,桶内排完序后,再按顺序依次取出,组成有序序列。
步骤:
- 找出序列中的最大和最小值,目的是为了确定所需桶的数量;
- 将数据放入相应的桶;
- 桶内数据进行排序,可以按照快排等算法进行排序;
- 桶内数据有序取出并合并成完整的有序序列。
实现代码(python):
from quick_sort import quick_sort #从快排引入快排包
def bucket_sort(alist, bucketsize):
minValue = alist[0]
maxValue = alist[1]
for i in alist:
if i < minValue:
minValue = i
elif i > maxValue:
maxValue = i
#桶数量
bucketcount = (maxValue - minValue +1) // bucketsize
#对应的桶
bucket_lists = list([] for _ in range(bucketcount))
#把数据放入相应的桶
for i in alist:
bucket_index = (i - minValue) // bucketsize
bucket_lists[bucket_index].append(i)
#桶内快排
for j in bucket_lists:
quick_sort(j, 0, len(j)-1) #这里采用的是快排,需要引入快排的包,因为篇幅原因,这里不放快排的代码
#合并数据
result = []
for j in bucket_lists:
if len(j) != 0:
result.extend(j)
return result
复杂度分析:
-空间复杂度
空间复杂度为O(n)
-时间复杂度
–最优时间复杂度:O(n)
–最坏时间复杂度:O(nlogn)
–平均时间复杂度:O(n)
是否属于原地排序算法:
不是一种原地排序算法
稳定性:
稳定
适应范围:
适应外部排序,即数据量比较大,但是数据范围比较小的排序