BucketSort
本文最后更新于 2024-03-06,本文发布时间距今超过 90 天, 文章内容可能已经过时。最新内容请以官方内容为准
Bucket Sort (桶排序)
Bucket Sort Alias: 基数排序(radix sort
属于 “分配式排序”(distribution sort)
Correct Version
# pyton 实现
#!/usr/bin/env python
#encoding=utf-8
import math
import itertools
def maximumGap(self, nums: List[int]) -> int:
n_max, n_min = max(nums), min(nums)
byte_max, byte_min = math.ceil(n_max.bit_length() / 8), math.floor(n_min.bit_length() / 8)
for i in range(byte_max):
if i < byte_min - 1:
continue
i_8 = i * 8
byte_check = 0xFF << i_8
buckets = [[] for _ in range(256)]
for num in nums:
buckets[(num & byte_check) >> i_8].append(num)
nums = list(itertools.chain.from_iterable(buckets))
pre_num, res_no = nums[0], 0
for num in nums[1:]:
if res_no < (i := num - pre_num):
res_no = i
pre_num = num
return res_no
Incomplete correct version (Only for reference)
What’s wrong with this version?
- It cannot deal with [1,100000], [1,10000,1000000,100].etc
Implementation
# pyton 实现
#!/usr/bin/env python
#encoding=utf-8
import math
def sort(a, radix=10):
"""a为整数列表, radix为基数"""
K = int(math.ceil(math.log(max(a), radix))) # 用K位数可表示任意整数
bucket = [[] for i in range(radix)] # 不能用 [[]]*radix
for i in range(1, K+1): # K次循环
for val in a:
bucket[val%(radix**i)/(radix**(i-1))].append(val) # 析取整数第K位数字 (从低到高)
del a[:]
for each in bucket:
a.extend(each) # 桶合并
bucket = [[] for i in range(radix)]
关键点解释(Explanation of key):
math.log(max(a), radix)
math.log(max(a), radix)
部分用于计算数组a
中最大值以radix
进制表示所需要的最小位数- 在基数排序算法中,
radix
参数代表的是所采用的基数,即我们通常所说的进制数。例如,当radix
为10
时,表示使用十进制进行排序;若radix
为2
,则表示使用二进制进行排序。
Code explanation
math.log(max(a), radix)
部分用于计算数组a
中最大值以radix
进制表示所需要的最小位数。- 初始化一个长度为
radix
的空桶列表bucket
,用于在每一轮迭代中存放对应每一位数值的元素。 - 循环
K
次,K
为所需的最大位数。在每一次循环中: - 遍历数组
a
中的每个元素,通过取模和除法操作来获取当前处理位上的数值,并将其放入对应的桶中。 - 清空原数组
a
,然后按照桶的顺序合并回原数组,这样就完成了对当前位的排序。 - 最终经过
K
轮循环后,数组a将被完全排序。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Unic
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果