小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
问题
请对10个长度为5的英文单词进行按字典顺序排序,要求由用户输入10个长度为5的英文单词,然后调用card_sort进行排序。
char str[10][6];
void card_sort( void )
解决
1.算法的概念
基数排序也叫作桶排序,对字符串进行排序的基本思路是建立许多“桶”,而这些桶是有序的。我们不断的将字符串从左到右的拆分出来放到对应的桶中,循环一个字符串长度的个数后,在讲最后一次的桶中数据取出,此时的字符串序列就是有序序列。
当然了,这样子的解释,对没有了解过基数排序的人来说可能毫无用处。
2.例子理解
那我们先来从简单的例子开始。
假设我们对四个数字串进行基数排序,它们分别是:355,223,227,139。
这个时候我们就设置一些桶这些桶的标签分别为:1,2,3,5,7,9。(即出现过的数字)
这个时候,我们开始第一轮放入操作:
首先我们从右侧第一个数字开始(原因等操作结束后就能理解了...吧..)
取出每个数字串的最后一位,分别是:5,3,7,9
我们将对应的数字串放进对应的桶中。
3: 223
5: 355
7: 227
9: 139
这里需要注意的是桶是有顺序的,我们数字串放进去时需要按照桶的顺序。
当我们将数字串全部放入后,我们再将他们全部取出来,这个时候我们就会得到新的数字串排列。
223,355,227,139
我们对新得到的数字串序列,进行第二轮放入操作
这次我们从右侧第二个数字开始
取出每个数字串的最后一位,分别是:2,5,2,3
我们将对应的数字串放进对应的桶中。
2: 223,227
3: 139
5: 355
这里我们发现有两个数字串的标签都为2,这里我们遵循的是先来先进的原则,即223在原本序列中处于227之前,那么在桶中依然如此。
同样的,当我们将数字串全部放入后,我们再次将他们全部取出来,得到新的数字串序列。
223,227,139,355
数字串只剩第一位,我们进行最后一次放入操作
取第一位:2,2,1,3
放入桶:
1: 139
2: 223,227
3: 355
取出数字串所得序列:
139,223,227,355
这时我们能够发现这个序列已经成了有序序列。
关于为什么要从最右边开始,我的想法是,因为决定级不同,决定级是我自己想的词语,大致意思就是无论你当前的大小如何,决定你最终位置的总是前一位,而当前这个决定级比较对用于对前一位相等时的比较起作用。
同样的字符串比较也如此般。