sortingalgorithm的稳定性是什么?为什么它很重要?

我很好奇,为什么稳定性在sortingalgorithm中是或不重要的?

一个sortingalgorithm被认为是稳定的,如果两个具有相同键的对象在sorting的输出中以相同的顺序出现在它们出现在要sorting的input数组中。 一些sortingalgorithm本质上是稳定的,如插入sorting,合并sorting,泡泡sorting等。而一些sortingalgorithm则不像堆sorting,快速sorting等。

背景 :一个“稳定的”sortingalgorithm保持与sorting键相同的项目顺序。 假设我们有一个5个字母的单词列表:

 peach straw apple spork 

如果我们按照每个单词的第一个字母对列表进行sorting,那么稳定sorting会产生:

 apple peach straw spork 

在一个不稳定的sortingalgorithm中, straw可以互换,但是在一个稳定的sortingalgorithm中,它们保持在相同的相对位置上(即straw在input之前出现在input之前,它也出现在输出之前)。

我们可以使用这个algorithm对单词列表进行sorting:按列5,然后是4,然后是3,然后是2,然后是1进行稳定sorting。最后,它将被正确sorting。 说服你自己。 (顺便说一句,该algorithm被称为基数sorting)

现在回答你的问题,假设我们有一个名字和姓氏的名单。 我们被要求按“姓,然后先”sorting。 我们可以先按名字sorting(稳定或不稳定),然后按姓氏sorting。 这些sorting之后,列表主要按姓氏sorting。 但是,在姓氏相同的情况下,名字sorting。

您不能以相同的方式堆叠不稳定的sorting。

这取决于你做什么。

想象一下,你有一些人的logging,第一个和最后一个姓氏字段。 首先按名字sorting列表。 如果你用姓按稳定的algorithm对列表进行sorting,你将得到一个按姓氏sorting的列表。

sorting稳定性意味着具有相同键的logging在sorting之前和之后保持它们的相对顺序。

所以,只有当你解决的问题需要保留这个相对顺序时,稳定性才有意义。

如果你不需要稳定性的话,你可以使用库中的快速内存抽取algorithm,比如heapsort或者quicksort,而忘记它。

如果你需要稳定,那就更加复杂了。 与不稳定algorithm相比,稳定algorithm具有更高的大O CPU和/或内存使用率。 所以,当你有一个大型的数据集,你必须select击败CPU或内存之间。 如果你受到CPU和内存的限制,那么你有问题。 一个好的妥协稳定algorithm是一个二叉树sorting; 维基百科的文章有一个很简单的基于STL的C ++实现。

通过添加原始logging号作为每个logging的最后一个键,可以使不稳定的algorithm变为稳定的algorithm。

有几个原因可以使稳定性变得重要。 一个是,如果两个logging不需要交换它们,你可以导致内存更新,页面被标记为脏,并且需要被重新写入磁盘(或另一个慢速媒体)。

一个稳定的sortingalgorithm就是按照它们在input中出现的顺序排列相同元素的sortingalgorithm ,而不稳定的sorting可能不能满足这种情况。

稳定的sortingalgorithm:

  • 插入sorting
  • 合并sorting
  • 泡沫sorting
  • 蒂姆sorting

不稳定的sortingalgorithm:

  • 堆sorting
  • selectsorting
  • 壳牌sorting
  • 快速sorting

在这里输入图像描述

9,6被错写了。 现在是9,8

如果你假定你正在sorting的只是数字,只有它们的值可以识别/区分它们(例如,具有相同值的元素是唯一的),那么sorting的稳定性问题是毫无意义的。

然而,sorting中优先级相同的对象可能是不同的,有时它们的相对顺序是有意义的信息。 在这种情况下,不稳定sorting会产生问题。

例如,你有一个数据列表,其中包含所有玩家用游戏中的Level [L]清理迷宫的时间成本[T]。 假设我们需要通过他们清理迷宫的速度来排列玩家。 但是,另外一个规则也适用:无论时间花费多长时间,清理更高级迷宫的玩家总是拥有更高的等级。

当然你也可以尝试用一些遵循规则的algorithm将配对值[T,L]映射到一个实数[R],然后用[R]值排列所有玩家。

但是,如果稳定的sorting是可行的,那么你可以简单地按照[T](更快的玩家先)和[L]sorting整个列表。 在这种情况下,玩家的相对顺序(按时间成本)在您按照他们所清理的迷宫级别进行分组后将不会改变。

PS:当然,两次sorting的方法不是解决特定问题的最佳scheme,而是要解释海报的问题就足够了。

如果两个具有相同键的对象在sorting的输出中以相同的顺序出现,就像sortingalgorithm在input未sorting的数组中出现的那样,sortingalgorithm被认为是稳定的。 一些sortingalgorithm本质上是稳定的,如插入sorting,合并sorting,泡泡sorting等。而一些sortingalgorithm则不像堆sorting,快速sorting等。

然而,任何给定的不稳定的分类algorithm都可以修改为稳定的。 可以有sortingalgorithm的具体方法使其稳定,但一般来说,任何本质上不稳定的基于比较的sortingalgorithm都可以通过改变键比较操作来修改为稳定的,以便两个键的比较将位置视为具有相同键的对象的因子。

参考文献: http : //www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

稳定的sorting将始终返回相同的input相同的解决scheme(排列)。

例如[2,1,2]将使用稳定sortingsorting[2,1,3](首先是索引2,然后是索引1然后索引3在sorting的输出)这意味着输出总是以同样的方式混洗。 其他不稳定但仍然正确的排列是[2,3,1]。

快速sorting不稳定sorting和相同元素之间的置换差异取决于拾取枢轴的algorithm。 有些实现是随机选取的,并且可以使用相同的algorithm在相同的input上快速sorting产生不同的排列。

稳定的sortingalgorithm是必要的确定性的。