您将对几乎排序的文件使用“插入”还是“选择排序”?

时间:2018-12-05 10:42:30

标签: algorithm sorting

我想知道您是对几乎排序的文件使用插入还是选择。两者平均进行多少次互换?我听说N/2O(n)都用于选择!我知道插入时必须扫描数组的已排序部分,以查找放置新元素的位置,但是在选择中,您必须扫描数组的整个未排序部分,以查找下一个要添加到未排序子数组开头的元素。

3 个答案:

答案 0 :(得分:5)

有许多流行的排序算法,旨在利用几乎排序的数据。可能最受欢迎的是timsort,以Python核心开发人员Tim Peters的名字命名,他首先提出并实现了该算法作为Python中使用的默认排序算法。现在,在许多Java版本中,排序算法也被用作默认的排序算法。

  

Timsort是一种混合稳定排序算法,它是从合并排序和插入排序中派生而来的,旨在对多种现实数据表现良好。该算法查找已排序数据的子序列,并使用该知识更有效地对其余数据进行排序。这是通过合并一个已标识的子序列(称为运行)与现有运行来完成的,直到满足某些条件为止。 [...] Wikipedia


当数据几乎按照某种程度排序时,插入排序非常有效:

  

当输入中的每个元素距离其排序位置Wikipedia不超过k个位置时,时间复杂度为O(nk)

插入排序不能利用数据几乎被排序的许多其他常见情况,例如反向顺序或当数据由两个运行的排序数据组成时(例如,从连接两个排序的数组的结果中得出)。

选择排序并不能真正从几乎排序的数据中受益。因此,如果您确实知道数据中的数据几乎是有序的,那么这是一个错误的算法选择。

答案 1 :(得分:1)

在选择和插入排序的比较中,选择排序在\Theta(n^2)中起作用,并比较列表中的所有值。因此,数组的近距离排序无助于选择排序更快地排序!但是,在插入排序中,最坏的情况是在O(n^2)中,对于几乎排序的数组,更改数组中未排序的部分将比选择排序时的性能更好。

答案 2 :(得分:0)

在“插入”排序中,对于最坏情况下的senarioО(n ^ 2)比较和交换,对于最佳情况下的O(n)比较,O(1)交换。

在选择排序中,已排序和未排序的数组没有任何区别,并且在最佳和最差情况下的复杂度都消耗n2(O(n2))的顺序。

因此,对于文件几乎已排序的情况,插入排序会更好。