顺序排序算法

时间:2010-12-12 12:24:56

标签: arrays algorithm sorting complexity-theory

我想对按顺序排列的元素进行排序,即我希望在下一个元素进入之前对我的向量进行排序。我知道插入排序的复杂性为n ^ 2,如果我总共有n个元素。合并排序应该更好。但是,通常认为合并排序具有复杂性n log n;但是我想如果你要一次排序n个元素就行了。如果他们一个接一个地来,你需要对临时矢量进行排序,那么复杂性就会达到\ sum_ {i = 2} ^ n i log(i)。这仍然不到我设想的n ^ 2,但绝对超过n log n。

这是对的吗?

由于

1 个答案:

答案 0 :(得分:2)

编辑2

\sum_{i=1}^N i log i > \sum_{i=1}^N i = O(N²)

编辑:显然,你错过了这一点,所以我会试着澄清一下。

首先,将N个元素插入到数组中,同时确保在每次插入后对数组进行排序,可以在复杂度O(N²)中完成。您可以使用以下算法插入一个元素:

  • 由于数组已排序,请使用二进制搜索来查找插入元素的位置。需要O(log i)时间,其中i是数组的当前大小。
  • 通过将所有元素向后移动一个点来插入元素。这涉及向上移动到i元素,因此它是O(i)。

对N个插入重复此算法因此得到\ sum_i(i + log i)= O(N²)。

要非常清楚:这不是插入排序。插入排序将涉及通过重新插入所有元素来对整个数组进行排序,而此算法仅插入一个元素。

其次,执行此操作不能比O(N²)更快地完成:将一个元素插入到大小为i的数组中,同时保持数组排序的复杂度大于O(i),因为它涉及到i的移动元素。 根本没有解决这个基本事实的解决方法:如果您将1插入[2,3,..,i],结果为[1,2,3,..,i],这意味着元素2,3。我被移动。

因此,总数大于\ sum_i i = O(N²)。