如果排序算法能够保持具有相等键值的元素之间的相对顺序,则称该排序为稳定排序。我的问题实际上是,维护这种相对顺序的好处是什么?可以给出一个例子吗?谢谢。
它使您的排序可以通过多个条件“链接”起来。
假设您有一个包含随机顺序的名字和姓氏的表格。如果您按照名字排序,然后按照姓氏排序,稳定的排序算法将确保具有相同姓氏的人按照名字排序。
例如:
将被保证处于正确的顺序。
优先队列是其中一个例子。假设你有以下数据:
如果你按照数字从小到大排序,一个不稳定的排序可能会做出这样的结果:
...但是"jane"超过了"bob",虽然应该是相反的顺序。
通常,它们用于在多个步骤中排序多个条目。
并不是所有的排序都基于整个值。考虑一个人员列表,我可能只想按照他们的姓名进行排序,而不是他们的全部信息。使用稳定的排序算法,我知道如果有两个名叫“John Smith”的人,则他们的相对顺序将得到保留。
Last First Phone
-----------------------------
Wilson Peter 555-1212
Smith John 123-4567
Smith John 012-3456
Adams Gabriel 533-5574
由于这两个“John Smith”已经是“排序好的”(他们按我想要的顺序),因此我不希望它们改变位置。如果我使用一个不稳定的排序算法按姓和名排序这些项目,我可能会得到以下结果:
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
你可以看到这两个 "John Smith" 已经交换了位置。这不是我想要的。
如果我使用一个稳定的排序算法,我将保证得到第一个选项,这正是我想要的。
一个例子:
假设你有一个数据结构,其中包含电话号码和拨打这些电话的雇员的配对信息。每次通话后都会添加一个号码/雇员记录。某些电话号码可能会被多个不同的员工拨打。
此外,假设你想按电话号码对列表排序,并向每个给定号码的前两位拨打电话的人提供奖金。
如果你使用不稳定的算法进行排序,可能无法保护给定电话拨打者的顺序,错误的员工可能会得到奖金。
稳定的算法可以确保每个电话号码的正确2名员工获得奖金。
有一种情况是当你想按多个键排序时。例如,要对名字/姓氏对列表进行排序,您可能首先按名字排序,然后按姓氏排序。
如果您的排序不稳定,那么您将失去第一个排序的好处。
假设您正在对具有两个字段的输入集进行排序,而您只对第一个字段进行排序。 '|'字符分隔字段。
在输入集中,您有许多条目,但是您有3个条目看起来像
。 。 。 AAA | 拖车 。 。 。 AAA | 租车 。 。 。 AAA | 管道工程 。 。 。
现在,当您完成排序时,您希望所有包含AAA的字段都在一起。
稳定的排序将为您提供: 。 。 。 AAA | 拖车 AAA | 租车 AAA | 管道工程 。 。 。
即,具有相同排序键AAA的三个记录在输出中与它们在输入中的顺序相同。请注意,它们没有按第二个字段排序,因为您没有对记录的第二个字段进行排序。
不稳定的排序将为您提供: 。 。 。 AAA | 管道工程 AAA | 租车 AAA | 拖车 。 。 。
请注意,记录仍然仅按第一个字段排序,并且第二个字段的顺序与输入顺序不同。
不稳定排序有可能更快。稳定排序往往模仿非计算机科学家/非数学专业人士在排序时脑海中的想法。例如,如果您使用索引卡进行插入排序,您很可能会得到一个稳定排序。
你不能总是一次性比较所有字段。举个例子:(1)内存限制,当你对一个大磁盘文件进行排序时,主内存中可能没有足够的空间来存储所有记录的所有字段;(2)对一个基类指针列表进行排序,其中某些对象可能是派生子类(你只能访问基类字段)。
此外,稳定的排序在给定相同输入时具有确定性输出,这对于调试和测试非常重要。