太累,有空再写文字描述把
def bucket_sort(array=[]):
# 1.得到数列的最大值最小值,并算出差值d
max_value = array[0]
min_value = array[0]
for i in range(1, len(array)):
if array[i] > max_value:
max_value = array[i]
if array[i] < min_value:
min_value = array[i]
d = max_value - min_value
# 2.初始化桶
'''
桶排序需要创建多个桶来协助排序
每一个桶代表一个区间范围,里面可以承载一个或多个元素
'''
bucket_num = len(array) # 创建桶的数量等于原始数列的元素数量
bucket_list = [] # 把所有的桶都保存再bucket_list 这个集合中,每个桶都是个列表
for i in range(0, bucket_num):
bucket_list.append([]) # 这个是数列再嵌套数列么
# 3.遍历原始数组,将每个元素放入桶中
for i in range(0, len(array)):
# 桶的区间跨度为什么按这个来算;他会随着i变化而变化
# /是整除在一定程度上可以算出来该整数的下标。最后一个桶中的元素一定不会重复,只有一个元素
num = int((array[i] - min_value) * (bucket_num-1) / d)
bucket = bucket_list[num] # 以这个为间隔来让元素加入到相应这个间隔的桶中;所以有些桶可能为空
bucket.append(array[i])
# 4.对每个桶内部进行排序
for i in range(0, len(bucket_list)):
# sort方法采用了时间复杂度O(nlogn)的排序算法
bucket_list[i].sort()
# 5.输出全部元素
sorted_array = []
for sub_list in bucket_list:
for element in sub_list:
sorted_array.append(element)
return sorted_array
my_array = list([4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09])
print(bucket_sort(my_array))