排序算法——基数排序

概述

从头实现基数排序。
基数排序(radix sort)算法,就是按照整数的个位、十位、百位…等依次排列元素,局部最优排列最终可以获得全局最优。

基数排序可以分为LSD和MSD两种,LSD就是从低位往高位排(个十百…),MSD是从高位往低位排(…百十个)。

基数排序的时间复杂度为 O ( n ∗ k ) O(n*k) O(nk),其中 n n n为元素数量, k k k为最大元素的最高位(个位为1,十位为2…),当元素不是很大时(即 k k k很小)可认为时间复杂度为 O ( n ) O(n) O(n).


实现过程

算法步骤:

  1. 取得数组中的最大数,并取得位数;

  2. 对数位较短的数前面补零;

  3. 分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中;

  4. 收集,再将放置在0~9号桶中的数据按顺序放到数组中;

  5. 重复3~4过程,直到最高位,即可完成排序。

对如下序列进行基数排序:[345,21,342,786,55,2,453,66,98,145,46,76,5,674].

采用LSD的方式来进行基数排序。

  • 第一步,按照个位分组
个位分组
0-
121
2342,2
3453
4674
5345,55,145,5
6786,66,46,76
7-
898
9-

依次连接后新的数组:[21, 342, 2, 453, 674, 345, 55, 145, 5, 786, 66, 46, 76, 98]

  • 第二步,按照十位分组
十位分组
02,5
1-
221
3-
4342,345,145,46
5453,55
666
7674,76
8786
998

依次连接后的新数组:[2, 5, 21, 342, 345, 145, 46, 453, 55, 66, 674, 76, 786, 98]

  • 第三步,按照百位分组
百位分组
02,5,21,46,55,66,76,98
1145
2-
3342,345
4453
5-
6674
7786
8-
9-

连接后的最终排序数组:[2, 5, 21, 46, 55, 66, 76, 98, 145, 342, 345, 453, 674, 786]

实例代码如下:

def radix(nums):
    factor = 1
    max_num = max(nums)
    n = 1
    while max_num >= 10:  # 获取最高位
        max_num //= 10
        n += 1
    while factor < 10 ** n:
        temp = [[] for _ in range(10)]
        for i in nums:
            temp[i // factor % 10].append(i)  # 元素归并到相应位的相应位置
        nums = []
        for i in temp:
            nums += i
        factor *= 10
    return nums


if __name__ == '__main__':
    print(radix([345, 21, 342, 786, 55, 2, 453, 66, 98, 145, 46, 76, 5, 674]))
    
[out]:
[2, 5, 21, 46, 55, 66, 76, 98, 145, 342, 345, 453, 674, 786]

尾记

基数排序思想也较为巧妙,时间复杂度达到了线性。但其应用受到限制,常用于非负整数序列的排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值