桶排序,主角当然是桶了
桶就是一个列表,存放的是一个范围内的数,同时还是有序的
桶排序需要的是一组桶,
桶之间的范围连续且相等,比如第一个桶范围是10-19,第二个桶的范围就是20-29
这些桶的范围正好包括需要排序的数
其中我们能知道的就只有列表中数的范围(max-min+1)加一的目的是防止越界,桶的个数需要自定义(n),
然后就能算出桶的范围了
遍历列表,计算出a[i]应该放入第几个桶,放的时候要保证桶里的元素有序,采用插入排序
最后遍历桶中的元素,依次赋值给原列表
a = [9, 78, 54, 91, 86, 53, 88, 66, 46, 15]
"""定义桶的个数"""
n = 10
"""定义桶"""
buckets = [[]for i in range(n)]
"""找到列表中的最大值和最小值,确定每个桶中数据的取值范围"""
max = a[0]
min = a[0]
for i in a:
if i > max:
max = i
if i < min:
min = i
num = (max - min + 1)/10
print(num)
"""遍历列表,将每个数放到对应的桶里,放的时候采用插入排序"""
for i in a:
d = int((i-min)//num) #计算i应该放到哪个桶里
buckets[d].append(i)
z = len(buckets[d])-2
while z >= 0 and i < buckets[d][z]:
buckets[d][z+1] = buckets[d][z]
z -= 1
buckets[d][z+1] = i
print(buckets)
"""将每个桶中的元素顺序放回原数组"""
count = 0
for list in buckets:
for item in list:
a[count] = item
count += 1
print(a)