桶排序
Created: March 15, 2022 10:00 PM
Introduction: 介绍什么是桶排序
Source: 原创
Tags: 算法专栏
什么是桶排序
- 在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法?
- 桶排序(Bucket Sort):首先将元素分在不同的桶中,在对每个桶中的元素排序。
def bucket_sort(li,n=100,max_num=10000):
"""
:param li: 列表
:param n: 分为100个桶
:param max_num: 最大数
:return:
"""
# 创建100个空桶
buckets = [[] for _ in range(n)]
# 遍历列表
for var in li:
# i 表示var放到几号桶里
"""
max_num // n: 表示一个桶里放多少个数
var // (max_num // n): 表示var放在第几个桶里
min(var // (max_num // n),n-1): 当num=10000的时候,应该放到100号桶里,但是我们只有0 - 99号桶(总计100个桶),所以放置在99号桶里
"""
i = min(var // (max_num // n),n-1)
# 将列表元素都放好对应的桶中
buckets[i].append(var)
# 桶内排序
for j in range(len(buckets[i])-1, 0, -1):
if buckets[i][j] < buckets[i][j - 1]:
buckets[i][j], buckets[i][j - 1] = buckets[i][j-1], buckets[i][j]
else:
break
sorted_li = []
for buc in buckets:
"""
append 任意,甚至是tuple
extend 只能是一个列表
"""
sorted_li.extend(buc)
return sorted_li
桶排序的效率
- 桶排序的表现取决于数据的发布。也就是需要对不同数据排序时采取不同的分桶策略。
- 平均情况时间复杂度: O ( n + k ) O(n+k) O(n+k)
- 最坏情况时间复杂度: O ( n 2 k ) O(n^2k) O(n2k)
- 空间复杂度: O ( n k ) O(nk) O(nk)
相关参考
清华大学博士讲解Python数据结构与算法:https://www.bilibili.com/video/BV1uA411N7c5?p=37