我试图了解在Radix排序中使用不稳定排序算法(如快速排序)的危险。 此外,在两种情况下都必须使用稳定的算法(即MSD Radix sort和LSD Radix sort)?
提前致谢。
答案 0 :(得分:0)
MSD基数排序通常不实用,因为虚拟垃圾箱在每次通过后都无法连接。如果按8位字节排序,在第一次传递后,你有256个独立的箱子,两次通过后,65536箱子,三次通过后,16777216箱子......,
LSD基数排序需要保持稳定,因为虚拟容器按顺序连接,并且后面的数据传递给更重要的数字"需要保留先前通行证所建立的顺序。请注意,LSD基数排序是旧卡分拣机可追溯到1900年代早期的操作方式。
http://en.wikipedia.org/wiki/IBM_card_sorter#Earlier_sorters
答案 1 :(得分:0)
这是给历史两分钟的好开始。
基数排序是您现在只能在中找到的卡片分类机使用的算法 电脑博物馆。卡片有80列,每列中一台机器可以 在12个位置之一打个孔。分拣机可以机械方式“编程” 检查卡组中每张卡的给定列,并将卡分发到一个卡中 12个纸箱,具体取决于打孔的位置。然后,操作员可以 逐个收集卡片,这样打孔第一位的卡片就位于 排在第二位的卡片,依此类推。 对于十进制数字,每列仅使用10位。 (其他两个地方 保留用于编码数字字符。)然后是d位数字 占据d列的字段。由于卡片分类器只能查看一列 一次,在d位数字上对n张卡片进行排序的问题需要进行排序 算法。 直观地讲,您可以按数字的最高有效位对数字进行排序, 递归生成的垃圾箱,然后按顺序组合卡片组。不幸, 由于必须将10个垃圾箱中的9个中的纸牌放在一边以对每个垃圾箱进行分类,因此 程序会产生许多中间的卡堆,您需要保留 踪迹。 (请参阅练习8.3-5。) 基数排序通过以下方式解决了卡片排序的问题-直观地 最低有效数字在前。然后,算法将卡片组合成一个 卡片组,其中0槽中的纸牌位于 2槽中的卡,依此类推。然后,它再次将第二副牌排序 有效数字并以类似方式重新组合甲板。该过程继续 直到卡片全部按d位排序。值得注意的是,那时 完全按d位数字排序。因此,只有d通过甲板 需要排序。图8.3显示了基数排序如何在七个“ deck”上运行 3位数字。 为了使基数排序正常工作,数字排序必须稳定。排序 卡分类器执行的操作很稳定,但是操作员必须警惕 即使将所有卡从存储卡中取出,也要更改它们的顺序 垃圾箱中的所选列中的数字相同。
-by CLRS
从本文中,您可能会发现,MSD基数排序是不可行的。
和
由于需要稳定的数字排序算法,让我们尝试通过示例来了解
假设要排序的列表
21、52、35、76、49、55、51、34、31、39
一次用数字对数字进行排序。
(21,51,31,)(52,)(34,)(35,55,)(76,)(49,39)<----这是我们使用稳定排序进行一次排序时的结果数字。
但是,如果我们使用不稳定的排序算法对一位数字进行排序,则括号内的值可以相互交换。
可以像 (31,51,21,)(52,)(34,)(35,55,)(76,)(49,39)<-----此顺序不会影响最终结果
让我们对此排序第十位数字
(21,)(31,34,35,39,)(49,)(51,52,55,)(76)<----如果我们使用稳定排序,这将是(最终)输出进行数字排序。
如果数字排序不稳定,则输出可能不是按顺序排序。
像这样 (21,)(39,35,39,31)(49,)(52,51,55,)(76)