我很好奇,为什么稳定性在排序算法中很重要或者不重要?
当前回答
这取决于你做什么。
假设您有一些具有姓和名字段的人员记录。首先按名字排序。如果使用稳定的算法按姓氏对列表进行排序,那么您将得到一个按姓和名排序的列表。
其他回答
如果你假设你正在排序的只是数字,并且只有它们的值才能识别/区分它们(例如,具有相同值的元素是相同的),那么排序的稳定性问题是没有意义的。
然而,排序中具有相同优先级的对象可能是不同的,有时它们的相对顺序是有意义的信息。在这种情况下,不稳定排序会产生问题。
例如,你有一个数据列表,其中包含所有玩家在游戏中使用关卡[L]清理迷宫的时间成本[T]。 假设我们需要根据玩家清理迷宫的速度来对他们进行排名。然而,这里还有一个附加规则:无论花费多长时间,以更高级别清理迷宫的玩家总是拥有更高的等级。
当然,你也可以尝试着将配对值[T,L]映射到一个实数[R],然后根据[R]值对所有玩家进行排序。
然而,如果稳定排序是可行的,那么你可以简单地按照[T](更快的玩家优先)和[L]对整个列表进行排序。在这种情况下,玩家的相对顺序(根据时间成本)不会在你根据他们清理的迷宫级别对他们进行分组后发生改变。
PS:当然,对特定问题进行两次排序的方法并不是最好的解决方案,但对于解释海报的问题来说,这应该足够了。
如果两个具有相同键的对象在排序输出中以与在输入未排序数组中相同的顺序出现,则排序算法称为稳定的。一些排序算法本质上是稳定的,如插入排序,归并排序,冒泡排序等。有些排序算法不是,比如堆排序,快速排序等等。
然而,任何给定的不稳定排序算法都可以被修改为稳定排序算法。可以有排序算法特定的方法使其稳定,但一般来说,任何基于比较的排序算法本质上不稳定,都可以通过改变键比较操作来修改为稳定,以便两个键的比较将位置作为具有相同键的对象的一个因素。
引用: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
如果两个具有相同键值的对象在排序输出中以与在待排序输入数组中相同的顺序出现,则排序算法称为稳定的。一些排序算法本质上是稳定的,如插入排序,归并排序,冒泡排序等。有些排序算法不是,比如堆排序,快速排序等等。
背景:一个“稳定的”排序算法使具有相同排序键的项保持有序。假设我们有一个5个字母的单词列表:
peach
straw
apple
spork
如果我们只根据每个单词的首字母对列表进行排序,那么稳定排序将产生:
apple
peach
straw
spork
在不稳定排序算法中,稻草和叉叉可能会互换,但在稳定排序算法中,它们的相对位置保持不变(即由于稻草在输入中出现在叉叉之前,因此在输出中也出现在叉叉之前)。
我们可以使用这个算法对单词列表进行排序:按第5列、第4列、第3列、第2列、第1列进行稳定排序。 最后,它将被正确排序。说服你自己。(顺便说一下,这个算法叫做基数排序)
现在来回答你的问题,假设我们有一个名字和姓氏的列表。我们被要求“先按姓,再按名”排序。我们可以先按名字排序(稳定或不稳定),然后按姓氏排序。在这些排序之后,列表主要按照姓氏排序。但是,如果姓氏相同,则对名字进行排序。
你不能以同样的方式堆叠不稳定的类型。
稳定排序总是在相同的输入上返回相同的解(排列)。
例如,[2,1,2]将使用稳定排序作为排列[2,1,3](第一个是索引2,然后是索引1,然后是索引3),这意味着输出总是以相同的方式洗牌。其他不稳定,但仍然正确的排列是[2,3,1]。
快速排序是不稳定的排序,同一元素之间的排列差异取决于选取枢轴的算法。有些实现是随机的,可以快速排序,使用相同的算法对相同的输入产生不同的排列。
稳定排序算法具有一定的确定性。
稳定排序算法是将相同的元素按照它们在输入中出现的相同顺序进行排序,而不稳定排序可能不满足这种情况。-我感谢我的算法讲师Didem Gozupek提供了关于算法的见解。
我再次需要编辑这个问题,因为有些人没有理解演讲的逻辑。它演示了对w.r.t. first元素进行排序。另一方面,您可以考虑由键-值对组成的示例。
稳定排序算法:
插入排序 归并排序 冒泡排序 蒂姆排序 计数排序 块排序 Quadsort 图书馆分类 鸡尾酒摇酒器 Gnome排序 奇偶排序
不稳定排序算法:
堆排序 选择排序 壳类 快速排序 Introsort(受制于快速排序) 树的种类 循环排序 Smoothsort 比赛排序(以Hesapsort为准)
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 我如何使用jQuery按字母顺序排序一个列表?
- 如何计算圆周长上的一点?
- 为什么处理排序数组比未排序数组慢?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 构造函数何时抛出异常是正确的?
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- 从整数列表中,求出最接近给定值的数
- 如何使用JavaScript比较软件版本号?数量(只)
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?