排序算法稳定有什么好处?

时间:2009-04-30 19:20:57

标签: algorithm sorting

如果它保持具有相等键的元素的相对顺序,则称它是稳定的。我想我的问题是,维持这种相对秩序有什么好处?有人能举个例子吗?感谢。

10 个答案:

答案 0 :(得分:62)

它使您的排序能够在多个条件下“链接”。

假设您有一个以随机顺序排列名字和姓氏的表格。如果按名字排序,然后按姓氏排序,稳定排序算法将确保具有相同姓氏的人按名字排序。

例如:

  • 史密斯,阿尔弗雷德
  • 史密斯,泽德

将保证按照正确的顺序。

答案 1 :(得分:41)

  

如果排序算法保留重复键的顺序,则它是稳定的。

     好的,很好,但为什么这很重要?好吧,当我们希望根据不同的密钥对同一数据进行多次排序时,就会出现排序算法中的“稳定性”问题。

     

有时数据项有多个键。例如,可能是(唯一的)主键,例如社会保险号,或学生识别号,以及一个或多个辅助键,例如居住城市或实验室部分。我们可能希望根据多个密钥对这些数据进行排序。问题是,如果我们根据一个键对相同的数据进行排序,然后根据第二个键,第二个键可能会破坏第一个排序所实现的排序。但如果我们的第二种类型是稳定的,那就不会发生这种情况。

来自Stable Sorting Algorithms

答案 2 :(得分:17)

优先级队列就是一个例子。说你有这个:

  1. (1,“bob”)
  2. (3,“bill”)
  3. (1,“jane”)
  4. 如果您从最小到最大的数字排序,不稳定的排序可能会这样做。

    1. (1,“jane”)
    2. (1,“bob”)
    3. (3,“bill”)
    4. ......但随后“jane”领先于“bob”,即使它应该是另一种方式。

      通常,它们可用于在多个步骤中对多个条目进行排序。

答案 3 :(得分:14)

并非所有排序都基于整个值。考虑一个人的名单。我可能只想用他们的名字来排序,而不是他们所有的信息。使用稳定的排序算法,我知道如果我有两个名为“John Smith”的人,那么他们的相对顺序将被保留。

Last     First       Phone
-----------------------------
Wilson   Peter       555-1212
Smith    John        123-4567
Smith    John        012-3456
Adams    Gabriel     533-5574

由于两个“约翰史密斯”已经“排序”(他们按照我想要的顺序),我不希望他们改变立场。如果我按顺序对这些项目进行排序,那么首先使用不稳定的排序算法,我最终可能会这样:

Last     First       Phone
-----------------------------
Adams    Gabriel     533-5574
Smith    John        123-4567
Smith    John        012-3456
Wilson   Peter       555-1212

这就是我想要的,或者我最终会得到这个:

Last     First       Phone
-----------------------------
Adams    Gabriel     533-5574
Smith    John        012-3456
Smith    John        123-4567
Wilson   Peter       555-1212

(你看到两个“约翰史密斯”已经换了位置)。这不是我想要的。

如果我使用稳定的排序算法,我将保证得到第一个选项,这就是我所追求的。

答案 4 :(得分:9)

示例:

假设您的数据结构包含电话号码对和调用它们的员工。每次通话后都会添加一个号码/员工记录。一些电话号码可能会被几个不同的员工召集。

此外,假设您要按电话号码对列表进行排序,并为前两个拨打任何给定号码的人提供奖励。

如果您使用不稳定的算法排序,则可能无法保留给定号码的来电者的顺序,并且错误的员工可以获得奖金。

稳定的算法可确保每个电话号码的2名员工获得奖金。

答案 5 :(得分:8)

这意味着如果您想按专辑排序,按轨道号排序,您可以先单击曲目编号,然后排序 - 然后单击专辑名称,并且每个专辑的曲目编号保持正确的顺序。

答案 6 :(得分:5)

一种情况是您想要按多个键排序。例如,要对名字/姓氏对列表进行排序,您可以先按名字排序,然后按姓氏排序。

如果你的排序不稳定,那么你将失去第一种的好处。

答案 7 :(得分:3)

对多个键进行稳定排序的优点是可疑的,您可以始终使用比较所有键的比较。如果您一次排序一个字段,那么这只是一个优势,就像点击列标题时一样 - Joe Koberg就是一个很好的例子。

如果您能够为记录添加序列号,可以将任何排序转换为稳定排序,并在使用等效键时将其用作打破平局。

当原始订单本身具有某种意义时,最大的优势就来了。我无法想出一个很好的例子,但我在考虑它的时候看到JeffH这样做了。

答案 8 :(得分:0)

假设您正在对包含两个字段的输入集进行排序,并且您只对第一个字段进行排序。 '|'字符划分字段。

在输入集中,您有许多条目,但是,您有3个看起来像

的条目

。 。 。 AAA |拖带 。 。 。 AAA |汽车租赁 。 。 。 AAA |水暖 。 。

现在,当您完成排序时,您希望其中包含AAA的所有字段都在一起。

稳定的排序会给你: 。 。 。 AAA |拖带 AAA |汽车租赁 AAA |水暖 。 。

即,具有相同排序键AAA的三个记录在它们在输入中的输出中具有相同的顺序。请注意,它们未在第二个字段上排序,因为您没有对记录中的第二个字段进行排序。

不稳定的排序会给你: 。 。 。 AAA |水暖 AAA |汽车租赁 AAA |拖带 。 。

请注意,记录仍然只在第一个字段上排序,并且顺序排序 第二个字段与输入顺序不同。

不稳定的排序有可能更快。稳定的类型往往模仿非计算机科学家/非数学人员在排序时的想法。即,如果您使用索引卡进行插入排序,则很可能会有一个稳定的排序。

答案 9 :(得分:0)

您不能总是一次比较所有字段。举几个例子:(1)内存限制,你要对大型磁盘文件进行排序,而且主内存中所有记录的所有字段都没有空间; (2)对基类指针列表进行排序,其中一些对象可能是派生的子类(您只能访问基类字段)。

此外,稳定的排序在给定相同输入的情况下具有确定性输出,这对于调试和测试非常重要。