sortingalgorithm稳定的好处是什么?

一个sorting被认为是稳定的,如果它保持相同的键元素的顺序。 我想我的问题是,维持这个相对顺序的好处是什么? 有人可以举个例子吗? 谢谢。

它使您能够通过多种条件“连锁”。

假设你有一个随机顺序的名字和姓氏的表。 如果按姓氏sorting,然后按姓氏sorting,则稳定sortingalgorithm将确保具有相同姓氏的人按姓氏sorting。

例如:

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

将保证按正确的顺序。

如果保留重复键的顺序,sortingalgorithm是稳定的。

好,很好,但为什么这应该是重要的? 那么,当我们希望根据不同的键不止一次地对相同的数据进行sorting时,就会出现sortingalgorithm中“稳定性”的问题。

有时数据项有多个键。 例如,可能是(唯一的)主键,例如社会保险号码或学生识别号码,以及一个或多个副键,例如居住城市或实验室部分。 而且我们可能希望根据多个关键字对这些数据进行sorting。 麻烦的是,如果我们按照一个按键对相同的数据进行sorting,然后按照第二个按键,则第二个按键可能会破坏第一个sorting所实现的sorting。 但是如果我们的第二类是一个稳定的sorting,这将不会发生。

从稳定的sortingalgorithm

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

  1. (1,“bob”)
  2. (3,“账单”)
  3. (1,“简”)

如果从最小到最大的数字sorting,不稳定的sorting可能会这样做。

  1. (1,“简”)
  2. (1,“bob”)
  3. (3,“账单”)

…但是“简”在“bob”之前,即使它本来是相反的。

一般来说,它们对于在多个步骤中sorting多个条目是有用的。

不是所有的sorting都是基于整个价值。 考虑一个人的名单。 我可能只想按他们的名字sorting,而不是所有的信息。 用一个稳定的sortingalgorithm,我知道如果我有两个人叫“约翰·史密斯”,那么他们的相对顺序就会被保留下来。

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

由于两个“约翰·史密斯”已经“sorting”(他们按照我想要的顺序),我不希望他们改变立场。 如果我最后sorting这些项目,那么首先使用不稳定的sortingalgorithm,我可能会以这种方式结束:

 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 

(你看到两个“约翰·史密斯”已经转换的地方)。 这不是我想要的。

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

这意味着如果您想按照专辑进行sorting,按轨道编号进行sorting,则可以先单击曲目编号,然后按顺序sorting – 然后单击专辑名称,曲目编号按照每个专辑的顺序保持不变。

一个例子:

假设你有一个包含电话号码和雇员的数据结构。 每次通话后添加号码/员工logging。 有些电话号码可能会被几个不同的员工调用。

此外,假设您想按电话号码对列表进行分类,并向前两个给予任何给定号码的人发放奖金。

如果按照不稳定的algorithm进行sorting,则可能无法保留给定号码的呼叫者的顺序,而错误的员工可能会获得奖金。

一个稳定的algorithm确保每个电话号码的正确的2名雇员获得奖金。

一种情况是当你想按多个键sorting。 例如,要排列名/姓对的列表,可以先按姓氏sorting,然后按姓氏sorting。

如果你的sorting不稳定,那么你将失去第一类的好处。

对多个键进行稳定sorting的优点是可疑的,你可以总是使用一次比较所有键的比较。 如果您一次排列一个字段,这是一个优势,就像点击列标题一样 – Joe Koberg就是一个很好的例子。

如果您可以为logging添加序列号,则可以将任何sorting转换为稳定的sorting,并在使用相同的键时将其用作打破平局。

当最初的订单本身具有某种意义时,最大的好处就来了。 我不能拿出一个很好的例子,但是当我想到的时候,我看到JeffH这么做了。

假设您正在对具有两个字段的input集进行sorting,而您只sorting在第一个字段上。 '|' 人物分割领域。

在input集中,您有很多条目,但是,您有3个条目

。 。 。 AAA |牵引。 。 。 AAA |汽车出租。 。 。 AAA |pipe道。 。 。

现在,当你完成sorting,你期望在他们所有的领域与AAA在一起。

稳定的sorting会给你:。 。 。 AAA |牵引AAA |汽车租赁AAA |pipe道。 。 。

即具有相同sorting键AAA的三个logging在input中的输出中的顺序相同。 请注意,它们不在第二个字段上sorting,因为您没有对logging中的第二个字段进行sorting。

不稳定的sorting会给你:。 。 。 AAA |水pipeAAA |汽车出租AAA |拖车。 。 。

请注意,logging仍然只在第一个字段上sorting,第二个字段的顺序与input顺序不同。

不稳定的sorting有可能会更快。 稳定的sorting倾向于模拟非计算机科学家/非math人员在分析某些内容时所处的位置。 也就是说,如果您使用索引卡进行插入sorting,您很可能会有一个稳定的sorting。

你不能总是一次比较所有的领域。 下面举几个例子:(1)内存限制,大型磁盘文件sorting的位置,主内存中所有logging的所有字段都没有空间; (2)对基类指针列表进行sorting,其中一些对象可能是派生子类(只能访问基类字段)。

而且,稳定sorting在给定相同input的情况下具有确定性输出,这对于debugging和testing可能是重要的。