基数排序(桶排序)——算法解析

453 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

问题

请对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

这时我们能够发现这个序列已经成了有序序列。

关于为什么要从最右边开始,我的想法是,因为决定级不同,决定级是我自己想的词语,大致意思就是无论你当前的大小如何,决定你最终位置的总是前一位,而当前这个决定级比较对用于对前一位相等时的比较起作用。

同样的字符串比较也如此般。