基数排序法与计数排序法一样,排序过程都需要借用桶来进行。基数排序的主要思路是:关键字n放入第n个桶,然后按序号将非空的桶连接在一起。关键字n就是将每个数据按个位,十位,百位.....进行分割而产生的
具体代码如下:
def radix_sort(arr):
# 找到最大值,确定最大位数
max_val = max(arr)
max_len = len(str(max_val))
# 从个位开始,依次进行排序
for i in range(max_len):
# 创建10个桶,用于存放每一位上的数字
buckets = [[] for _ in range(10)]
# 将每个数字放入对应的桶中
for num in arr:
digit = (num // 10**i) % 10
buckets[digit].append(num)
# 将桶中的数字依次取出,放入原数组中
arr = [num for bucket in buckets for num in bucket]
return arr
print(radix_sort([345,345,234,67,342,234]))
代码解释:
(1)有这样一组数列,现在我们对其进行递增排序
(2)无论是个位,十位,还是百位都是由数字0~9组成,因此创建0~9号桶
(3) 将数据按个位分类
(4) 按照桶号顺序,将数据从各桶中取出来
(5)创建0~9号桶
(6) 再将数据按十位分类
(7) 按照桶号顺序,将数据从各桶中取出来
(8)创建0~9号桶
(9) 再将数据按百位分类
(10) 按照桶号顺序,将数据从各桶中取出来
(11)至此排序结束,返回结果
小结:
基数排序适用于整数排序,特别是当整数范围较大时,其时间复杂度为O(d*(n+b)),其中d是数字的位数,b是进制数(这里是10),n是数组长度。对于小范围整数排序,其效率可能不如快速排序、归并排序等比较型排序算法。
注意事项:
- 基数排序是稳定的排序算法,即相等的元素在排序后保持原来的顺序。
- 基数排序的空间复杂度为O(n+b),其中b是进制数。
- 基数排序适用于整数排序,不适用于浮点数或字符串排序。
- 基数排序的时间复杂度依赖于数字的位数和进制数,对于大范围整数排序,可能需要更多的位数和桶。
平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | |
基数排序算法 | O(n*b) | O(n*b) | O(n+b) |