一、原理
桶排序是计数排序的升级版,如果计数排序中数的范围比较大呢?之前的计数排序数字范围是1-200,假如1-20000呢?利用桶排序就可以对其进行优化。
步骤:
(1)将元素分在不同的桶中
(2)在对每一个桶中的元素进行排序
桶排序的的快慢取决于数据的分布:
- 当输入的数据可以均匀的分配到每一个桶中,排序最快
- 当输入的数据被分配到了同一个桶中,排序最慢
关键点:
- 每一个桶中有多少个数
- 每一个数应该放到哪一个桶中
二、实现
def binSort(li,min_num,max_num,bin_num=10): bin=[[] for i in range(bin_num)]#[ [],[],[],... ] for num in li: n=(max_num-min_num+1)/bin_num #表示多少个数在一个桶里 bin[int(num // n)].append(num) #对应的数字放在对应的桶里 #维护桶有序,每一个桶使用插入排序,注意这是对每一个桶中的数进行排序 i=len(bin[int(num // n)])-1 #i表示桶中的最后一个数 tmp=bin[int(num // n)][i] j=i-1 while j>=0 and tmp<bin[int(num // n)][j]: bin[int(num // n)][j+1]=bin[int(num//n)][j] j=j-1 bin[int(num // n)][j+1]=tmp
#对每一个桶中的数进行合并,返回已经排序好的序列 res=[] for l in bin: res.extend(l) return res import random li=[random.randint(0,600) for i in range(10000)] print(binSort(li,0,600))