Python 基数排序的代码实现

目录

基数排序简介

基数排序原理

基数排序动态演示

Python实现基数排序

小结

基数排序的时间复杂度和稳定性

1. 时间复杂度

2. 稳定性


基数排序简介

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


基数排序原理

        基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

扫描二维码关注公众号,回复: 15015159 查看本文章

基数排序动态演示


Python实现基数排序

def radix_sort(array):
    max_num = max(array)
    place = 1
    while max_num >= 10**place:
        place += 1
    for i in range(place):
        buckets = [[] for _ in range(10)]
        for num in array:
            radix = int(num/(10**i) % 10)
            buckets[radix].append(num)
        j = 0
        for k in range(10):
            for num in buckets[k]:
                array[j] = num
                j += 1
    return array

array = [25, 17, 33, 17, 22, 13, 32, 15, 9, 25, 27, 18]
print(radix_sort(array))rt(array))

运行结果:

        [9, 13, 15, 17, 17, 18, 22, 25, 25, 27, 32, 33]


小结

        代码中,使用Python内置函数max()求出了待排序列表中的最大值,并求出了最大值的位数place。然后创建了10个桶,从数字的个位数开始,将数据进行分桶,所有数据都分完桶之后,将数据从桶中取出,按顺序重新赋值给待排序列表。

        代码中的 i 表示按数据的第 i 位进行分桶,i 从个位一直到最高位,radix 表示分桶时桶对应的数字为 radix,j 表示合并桶中的数据时,将数据赋值给待排序列表中索引 j 的位置。


基数排序的时间复杂度和稳定性

1. 时间复杂度

        在基数排序中,需要走访待排序列表中的每一个元素进行分桶,列表长度为 n , 然后将每个桶中的数据取出进行合并,一共有 k 个桶,所以进行一轮基数排序的时间复杂度为T(n)=n+k,再乘分桶和合并的步骤数(常数,不影响大O记法),得出进行一轮基数排序的时间复杂度为 O(n+k) 。当待排序列表中的最大值有 d 位时,需要进行 d 轮基数排序,时间复杂度为 O(d*(n+k)) 。

2. 稳定性

        在基数排序中,需要将待排序列表中的数据进行分桶和合并。在分桶时,如果有相等的数据,它们一定会被分到同一个桶中,是按先后顺序进入桶中的,在合并桶时,按先进先出的原则,先进桶的数据先出桶,相等数据的相对次序不会发生变化。所以基数排序是一种稳定的排序算法。

猜你喜欢

转载自blog.csdn.net/leyang0910/article/details/130469522