"算法导论"一书提到了基数排序的LSD(最低有效位)版本。然而,在stackoverflow上,其他人已经指出了MSD(最高有效位)版本的存在。因此,我想了解每个版本的优缺点。我猜LSD版本比MSD版本有一些优势,但我不确定。因此提出这个问题。
"算法导论"一书提到了基数排序的LSD(最低有效位)版本。然而,在stackoverflow上,其他人已经指出了MSD(最高有效位)版本的存在。因此,我想了解每个版本的优缺点。我猜LSD版本比MSD版本有一些优势,但我不确定。因此提出这个问题。
如同在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。
当长度固定时,LSD比MSD更快。对于小文件,MSD太慢了,而且它需要在小文件上进行大量的递归调用。