作者:ziuch
单位:江西财经大学
大家都知道xt现在在备战北大,北大的复试是有上机的环节的,xt很怕会被复试筛掉,所以提前了一年时间在备战上机测试。今天在模拟测试的时候,前三道题xt分别用Python,C++,Java解决了,到了第四题,xt看时间很充足就想去吃个饭,所以xt把希望都寄托在你身上了,第四道是一道链表的题目,考察基数排序。
链式基数排序(这里以对若干个正整数的排序为例描述求解过程):待排序的正整数存放在一个单链表buf中。此外还需要10个单链表,编号为0~9。10个单链表称为10个桶。编写一个程序,读入n个正整数,并按从小到大的顺序排序。
链式基数排序的算法如下:遍历buf中的每个节点,并根据它的个位将每个值安排某个桶链表中。例如,97安排在桶链表7,3安排在桶链表3,而100安排在桶链表0——这个过程叫分派。
在桶链表中循环,并将值复制回到最初的buf链表——这个过程叫收集。上面的数值在buf中的新顺序是100、3和97。
接下来依次取buf链表中所有数字的十位,百位,千位等等,并按取出的十位,百位,千位等位上的数字不断分派和收集;重复这个过程(分派—收集),当处理完了buf链表中最大数字的最高位时,就停止这个过程。
例如,在对buf链表进行第2轮处理时,100安排在桶链表0,3安排在桶链表0(它仅有一个数位),而97安排在桶链表9。buf链表中值的顺序是97、3和100。在第3轮处理时,100安排在桶链表1,3安排在桶链表0,而97安排在桶链表0(在3之后)。基数排序可以确保在处理了最大数字的最高位之后正确排列所有值的顺序。
注意
为保持输出结果的一致性,我们约定所有单链表的插入都使用头插法。
输入格式:
第一行输入待排序个数n(1≤n≤100000),再输入n个正整数(每个数在C语言整型表示范围之内)。
输出格式:
输出每趟分派-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每个数之间用空格隔开。
输入样例:
在这里给出一组输入。例如:
10
278 109 63 930 589 184 505 269 8 83
输出样例:
在这里给出相应的输出。例如:
930 83 63 184 505 8 278 269 589 109
505 8 109 930 63 269 278 83 184 589
8 63 83 109 184 269 278 505 589 930
思路
建议直接看懂用例,第