桶排序/基数排序(Radix Sort)

桶排序/基数排序(Radix Sort):

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

基本思想:

第一步
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93

代码实现:

import math
def radix_sort(lists, radix=10):
    k = int(math.ceil(math.log(max(lists), radix)))  # 用K位数可表示任意整数
    bucket = [[] for i in range(radix)]
    for i in range(1, k + 1):  # K次循环
        for j in lists:
            bucket[j // (radix ** (i - 1)) % (radix ** i)].append(j)  # 从低到高析取整数第K位数字
        del lists[:]
        for z in bucket:
            lists += z
            del z[:]  # 清空桶
    return lists
上一篇:其他数据类型转换为“字符串”


下一篇:十大经典排序之基数排序(C++实现)