排序算法——基数排序
概述
基数排序(radix sort)算法,就是按照整数的个位、十位、百位...等依次排列元素,局部最优排列最终可以获得全局最优。
基数排序可以分为LSD和MSD两种,LSD就是从低位往高位排(个十百...),MSD是从高位往低位排(...百十个)。
基数排序的时间复杂度为\(O(n*k)\),其中\(n\)为元素数量,\(k\)为最大元素的最高位(个位为1,十位为2......),当元素不是很大时(即\(k\)很小)可认为时间复杂度为\(O(n)\).
实现过程
算法步骤:
取得数组中的最大数,并取得位数;
对数位较短的数前面补零;
分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中;
收集,再将放置在0~9号桶中的数据按顺序放到数组中;
重复3~4过程,直到最高位,即可完成排序。
对如下序列进行基数排序:[345,21,342,786,55,2,453,66,98,145,46,76,5,674]
.
采用LSD的方式来进行基数排序。
- 第一步,按照个位分组
个位 | 分组 |
---|---|
0 | - |
1 | 21 |
2 | 342,2 |
3 | 453 |
4 | 674 |
5 | 345,55,145,5 |
6 | 786,66,46,76 |
7 | - |
8 | 98 |
9 | - |
依次连接后新的数组:[21, 342, 2, 453, 674, 345, 55, 145, 5, 786, 66, 46, 76, 98]
- 第二步,按照十位分组
十位 | 分组 |
---|---|
0 | 2,5 |
1 | - |
2 | 21 |
3 | - |
4 | 342,345,145,46 |
5 | 453,55 |
6 | 66 |
7 | 674,76 |
8 | 786 |
9 | 98 |
依次连接后的新数组:[2, 5, 21, 342, 345, 145, 46, 453, 55, 66, 674, 76, 786, 98]
- 第三步,按照百位分组
百位 | 分组 |
---|---|
0 | 2,5,21,46,55,66,76,98 |
1 | 145 |
2 | - |
3 | 342,345 |
4 | 453 |
5 | - |
6 | 674 |
7 | 786 |
8 | - |
9 | - |
连接后的最终排序数组:[2, 5, 21, 46, 55, 66, 76, 98, 145, 342, 345, 453, 674, 786]
实例代码如下:
1 | def radix(nums): |
尾记
基数排序思想也较为巧妙,时间复杂度达到了线性。但其应用受到限制,常用于非负整数序列的排序。