我很好奇,为什么稳定性在排序算法中很重要或者不重要?
当前回答
稳定性之所以重要,有几个原因。一个是,如果两个记录不需要交换,交换它们可能会导致内存更新,一个页面被标记为脏,并且需要重新写入磁盘(或其他慢介质)。
其他回答
稳定性之所以重要,有几个原因。一个是,如果两个记录不需要交换,交换它们可能会导致内存更新,一个页面被标记为脏,并且需要重新写入磁盘(或其他慢介质)。
这取决于你做什么。
假设您有一些具有姓和名字段的人员记录。首先按名字排序。如果使用稳定的算法按姓氏对列表进行排序,那么您将得到一个按姓和名排序的列表。
我知道这个问题有很多答案,但对我来说,罗伯特·哈维的这个答案总结得更清楚:
稳定排序是一种保留输入集原始顺序的排序,其中[不稳定]算法不区分两个或多个项。
源
排序稳定性是指具有相同键的记录在排序前后保持相对顺序。
因此,当且仅当你要解决的问题需要保持相对顺序时,稳定性才重要。
如果你不需要稳定性,你可以从库中使用一个快速的、占用内存的算法,比如堆排序或快速排序,然后忘记它。
如果你需要稳定,那就更复杂了。稳定算法比不稳定算法具有更高的大o CPU和/或内存使用量。所以当你有一个大的数据集时,你必须在CPU和内存之间做出选择。如果CPU和内存都受到限制,就有问题了。一种较好的折衷稳定算法是二叉树排序;维基百科上有一个基于STL的c++实现,简单得可怜。
通过添加原始记录号作为每条记录的最后位置键,可以将不稳定的算法变为稳定的算法。
如果两个具有相同键的对象在排序输出中以与在输入未排序数组中相同的顺序出现,则排序算法称为稳定的。一些排序算法本质上是稳定的,如插入排序,归并排序,冒泡排序等。有些排序算法不是,比如堆排序,快速排序等等。
然而,任何给定的不稳定排序算法都可以被修改为稳定排序算法。可以有排序算法特定的方法使其稳定,但一般来说,任何基于比较的排序算法本质上不稳定,都可以通过改变键比较操作来修改为稳定,以便两个键的比较将位置作为具有相同键的对象的一个因素。
引用: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
推荐文章
- 设计模式:工厂vs工厂方法vs抽象工厂
- 我如何使用jQuery按字母顺序排序一个列表?
- 如何计算圆周长上的一点?
- 为什么处理排序数组比未排序数组慢?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 构造函数何时抛出异常是正确的?
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- 从整数列表中,求出最接近给定值的数
- 如何使用JavaScript比较软件版本号?数量(只)
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?