Coding is the closest thing we have to a surperpower

3020 : 排序进阶-基数排序
描述

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

基数排序原理如下:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次桶排序,即首先以个位数数字为桶编号依次入桶。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序的时间复杂度是 O(k·n),其中n是排序元素个数,k是数字位数。

假如我们有待排序数组[62,14,59,88,16],排序过程如下:

1.分配10个桶,以个位数数字为桶编号依次入桶,此时桶中数据如下:

16891432086687.png

2.将桶里的数字顺序取出来,输出结果:[62,14,16,88,59]

3.再次入桶,不过这次以十位数的数字为准,进入相应的桶,此时桶中数据如下:

16891432172517.png

由于前边做了个位数的排序,所以当十位数相等时,个位数字是由小到大的顺序入桶的,起到了排序的效果。

4.因为没有百位数,所以到这排序完毕,顺序取出即可,输出结果:[14,16,59,62,88]。

输入

第一行给出一个整数n,表示数字的个数,n≤20。

接下来一行有n个整数,表示输入的n个数,数据保证输入的数字位数不超过100位。

输出

运用基数排序的方法,输出对每一位排序后的结果,每次输出占一行。

样例

输入

5
62 14 59 88 16

输出

62 14 16 88 59
14 16 59 62 88

输入

15
6634 9796 435 1405 6123 10001 11459 12018 10372 19874 12860 11326 7096 30205 27010

输出

12860 27010 10001 10372 6123 6634 19874 435 1405 30205 9796 11326 7096 12018 11459
10001 1405 30205 27010 12018 6123 11326 6634 435 11459 12860 10372 19874 9796 7096
10001 27010 12018 7096 6123 30205 11326 10372 1405 435 11459 6634 9796 12860 19874
10001 30205 10372 435 11326 1405 11459 12018 12860 6123 6634 27010 7096 9796 19874
435 1405 6123 6634 7096 9796 10001 10372 11326 11459 12018 12860 19874 27010 30205
提示

本题使用的基数10,实际上,基数不一定需要为10,采用更大的基数(即将数表示为更大的进制)可以提高基数排序的速度。

标签
语言:
主题: