这本书"Introduction to Algorithms"提到了基数排序的LSD(最低有效数字)版本。但是,正如其他人在stackoverflow中指出的那样,MSD(最高有效数字)版本也存在。所以我想知道每一个的利弊。我的猜测是LSD版本比MSD版本有一些好处,但我不确定。因此问题。
答案 0 :(得分:9)
取自链接,可能有用:http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_sorting.aspx(在最底层)
LSD基数排序的最大问题是它从最小差异的数字开始。如果我们可以从最重要的数字开始,第一遍将对整个范围进行排序,并且在此之后的每次传递将简单地处理细节。 MSD基数排序的想法是将具有相等值的所有数字划分到它们自己的桶中,然后对所有桶执行相同的操作,直到对数组进行排序。当然,这表明一个递归算法,但它也意味着我们现在可以对可变长度的项进行排序,我们不必触摸所有的数字来获得一个排序的数组。这使得MSD基数排序更快,更有用。
答案 1 :(得分:4)
当有固定长度时,LSD比MSD快。 MSD对于小文件来说太慢了,它需要对小文件进行大量的递归调用。
答案 2 :(得分:3)
如书Algorithms所述,LSD和MSD都是字符串数组排序算法,基于所谓的密钥索引计数而不是比较。 因此,与传统的快速排序或合并排序相比,LSD和MSD具有不同的运行时间。
正如Dzhabarov所提到的,LSD和MSD之间的最大区别在于MSD首先考虑最重要的数字或字符,它本质上排序字符串而不迭代字符串中的所有数字。这是一个优点。但是,MSD的递归实现比LSD使用更多的空间。
下表说明了快速排序,LSD和MSD之间的部分区别。
algorithm running time extra space
quicksort N(lgN)^2 1
LSD NW N
MSD between N and NW N + WR
其中N是数组的长度,W是字符串的长度,R是基数的大小。
PS:正如书中所提到的,Java系统排序使用一般排序算法,快速字符串比较,而不是LSD或MSD。