【发布时间】:2018-12-05 19:23:00
【问题描述】:
我想知道您是否会对几乎排序的文件使用插入或选择。他们俩平均进行多少次掉期?我听说N/2 和O(n) 都用于选择!我知道通过插入,您必须扫描数组的已排序部分以找到放置新元素的位置,但在选择中,您必须扫描数组的整个未排序部分以找到下一个要添加到未排序子数组开头的元素.
【问题讨论】:
我想知道您是否会对几乎排序的文件使用插入或选择。他们俩平均进行多少次掉期?我听说N/2 和O(n) 都用于选择!我知道通过插入,您必须扫描数组的已排序部分以找到放置新元素的位置,但在选择中,您必须扫描数组的整个未排序部分以找到下一个要添加到未排序子数组开头的元素.
【问题讨论】:
有许多流行的排序算法旨在利用几乎排序的数据。最流行的可能是timsort,以 Python 核心开发人员 Tim Peters 命名,他首先提出并实现了该算法作为 Python 中使用的默认排序算法。排序算法现在也被用作许多 Java 版本中的默认排序算法。
Timsort 是一种混合稳定排序算法,源自合并排序和插入排序,旨在在多种现实世界数据上表现良好。 [...] 该算法找到已经排序的数据的子序列,并使用该知识对剩余部分进行更有效的排序。这是通过将已识别的子序列(称为运行)与现有运行合并来完成的,直到满足某些标准。 [...]Wikipedia
当数据几乎被排序时,插入排序非常有效,因为它是近似排序的:
当输入中的每个元素距离其排序位置不超过 k 个位置时,时间复杂度为 O(nk) Wikipedia
插入排序无法利用数据几乎已排序的许多其他常见情况,例如倒序或当数据由两次运行的排序数据组成时(例如,来自连接两个排序数组的结果)。
选择排序并没有真正从几乎排序的数据中受益。因此,如果您确实知道您的数据在其中有一些接近的顺序,那么这是一个糟糕的算法选择。
【讨论】:
在选择排序和插入排序的比较中,选择排序工作在\Theta(n^2),并比较列表中的所有值。因此,数组的临近排序无助于选择排序中的排序更快!但是,在插入排序中,最坏的情况是在 O(n^2) 中,对于几乎已排序的数组,更改数组的未排序部分并且在您的情况下将具有比选择排序更好的性能。
【讨论】:
在插入排序中,对于最坏情况 О(n^2) 比较和交换,对于最佳情况 O(n) 比较,O(1) 交换。
在选择排序中,已排序和未排序的数组没有任何区别,并且在最佳和最坏情况下都消耗 n2 (O(n2)) 的顺序。
所以对于几乎排序文件的情况,插入排序会更好。
【讨论】: