一、引入
在计数排序中,如果元素的范围比较大(比如在1到1亿之间),此时使用计数排序会创建一个巨大的列表,占用大量的内存空间,那么我们怎么改造算法?
二、桶排序
桶排序(Bucker_sort):首先将元素放在不同的桶中,在对每个桶中的元素排序。
示例代码如下所示:
def bucket_sort(li, n = 100,max_num = 10000): # n为共有100个桶,数据的最大值为10000
buckets = [[] for _ in range(n)] # 创建桶的集合,注意为二维数组
for var in li:# 遍历列表的所有数字
# 共有100 个桶,且最大的数字为10000,此时我们让每个桶装的数字范围为100
i = min(var // (max_num // n), n - 1) #其中(max_num//n )为每个桶存放数字的范围,约为100
# i = (var // (max_num // n)) 为当前取到的var放到几号桶中,加上min是为了让最后超出桶范围的数字放到最后一个桶中,例如10000 > 9999,将10000放入最后一个桶中
buckets[i].append(var) #将数值放回去
# 此时已将将数字放入对应的桶中,我们再对桶中的数值进行排序
# 我们运用反向的冒泡排序
# 如果前面的数字比后面的数字大,我们对其交换位置
for j in range(len(buckets[i])-1, 0, -1): #[0,2,4,3] j指向最后一个元素