![ba0540b11d309636c0422df1eeb9b71c.png](https://i-blog.csdnimg.cn/blog_migrate/95695fe3f2dd7cfb9b667c22496135ca.jpeg)
Radix Sort 基数排序是对计数排序的改进,该算法可以支持针对浮点、字符串等类型元素进行排序。其主要思想是将排序元素按数位分割依次排序,从而实现整体有序。其同样可以具有线性时间的性能
基本原理
在对非负整数进行基数排序时,需要首先将排序元素统一为相同的数位长度,数位不足的排序元素可以添加前导零的方式实现数位长度统一对齐;然后从排序元素的最低位(个位)开始进行排序,直到完成对最高位的排序,此时即实现了对排序元素的整体排序。而对每个数位进行排序的过程则是通过(稳定的)计数排序完成的,故基数排序同样是稳定的。由于我们是从排序元素的最低位向最高位依次排序的,故这种方式被称为最低位(LSD,Least Significant Digit)法;反之,如果是从排序元素的最高位向最低位依次排序的,则被称之为最高位(MSD,Most Significant Digit)法
实际上,基数排序算法对排序元素的类型不要求一定是非负整数才可以进行,其对于字符串、浮点数等类型均可适用。其关键在于要求排序元素的数位长度统一。例如对整数排序时,如果排序元素中含有负数,则可以对排序元素均加上一个数使其全部为非负整数;如果元素类型是字符串的话,在计数排序过程中,可以直接使用该位字符对应ASCII码值进行计数,对于长度不足的字符串,可直接在其后面补0实现长度对齐。即在计数排序过程中,如果发现某位字符是为对齐所填充的0的话,则可认为其对应的ASCII码值为0进行计数,因为字符'A'所对应的ASCII码值是65,字符'0'所对应的ASCII码值是48,均比0大。这样即可保证基数排序的结果是符合字典序的
实现
这里是一个通过Java实现的对非负整数类型的元素进行基数排序的实例,来帮助大家更好地理解该算法
/**
测试结果如下:
![517be83e1036d2443ca49054dbc09659.png](https://i-blog.csdnimg.cn/blog_migrate/9c99d3219031efe82c848725d4ff230e.jpeg)
特性
N为排序元素的数目,r为基数,d为排序元素的最大位数(长度)。当d为常数且r=O(N)时,其具有线性时间复杂度
![bce88bd315acb29b030424d5280e8933.png](https://i-blog.csdnimg.cn/blog_migrate/e14ef5d74365cbfb1b07cd9e792bedfe.jpeg)
参考文献
- 算法导论 · 第3版
- 计算机程序设计艺术(第3卷):排序与查找 高德纳(Donald E.Knuth) 著