只是想知道是否有人可以解释为什么“不稳定的排序”被认为是坏的?基本上我没有看到任何真正重要的情况。有人可以提供一个吗?
答案 0 :(得分:23)
如果您有一个允许人们通过单击该列对各个列进行排序的GUI,并且您使用稳定的排序,那么知道的人可以通过单击对列A,B,C进行多列排序列C,B,A依次排列。因为排序是稳定的,当你点击B时,B下任何具有相同键的记录仍然会被C排序,所以在点击B后,记录按B,C排序。同样,在你点击A后,记录被排序由A,B,C。
(不幸的是,上次我在某些微软产品或其他产品上试过这个产品时,它似乎没有使用稳定的排序,因此这个技巧并不为人所知,这并不奇怪。)
答案 1 :(得分:4)
想象一下,你想组织一副牌。您可以先按套装排序,然后按数值排序。如果你使用稳定的排序,你就完成了。如果你使用了不稳定的排序,那么它们将按照数字顺序排列,但这些套装会再次搞砸了。实际发展问题中存在许多相同的情况。
答案 2 :(得分:3)
在少数情况下,您需要一种稳定的排序算法。这方面的一个例子是,如果你正在实现像Radix排序这样的东西,这取决于用作构建块的比较排序算法是稳定的。 (基数排序可以在线性时间内运行,但它的输入比比较排序算法更受限制。(比较排序需要O(n lg n)时间))
不稳定的那种不一定是“坏”;更重要的是,稳定的那种“在某些情况下是可取的”。这就是编程语言的原因,例如C ++的标准模板库,提供两者 - 例如std::sort
和std::stable_sort
- 允许您指定何时需要稳定性,何时不需要。
答案 3 :(得分:1)
因为他们可以做得比我能做得更好......来自Developer Fusion:
有两种排序 算法:“稳定排序”和 “不稳定的种类”。这些术语指的是 两个人采取的行动 值比较相等。如果你有 一个数组T0..size有两个元素Tn 并且Tk表示n< k,和这两个 元素比较平等,稳定 排序它们将出现在已排序的 输出,其值为Tn 在Tk之前。输出顺序 保留原始输入顺序。一个 相反,不稳定的排序有 不保证这两个的顺序 输出中的元素。
请注意,快速排序等排序算法不稳定或不稳定。实施将决定它是什么。
在任何情况下,稳定不一定比不稳定更好或更差 - 只是有时你需要保证订单两个相等的元素。当做需要保证时,不稳定是不合适的。