插入排序的错误情况时间复杂度不正确

时间:2017-10-27 17:15:15

标签: algorithm insertion-sort

嗨,我是算法的新手,我很着迷。

我试图找出插入排序的最坏情况时间复杂度,并将其称为O(n ** 2)。相反,我们可以将时间复杂度定为O(N * logN)。

这是我的解释,

插入排序查看第一个元素并假设它已排序。接下来,它查看第二个元素,并与前一个已排序的1个元素子列表进行比较,并根据与前一个已排序子列表中的元素进行比较来插入它。这个过程也是类似的。

每个地方都提到要将一个元素插入到前一个已排序的子列表中,基本上是线性搜索,它需要O(N)时间,因为我们对n个元素进行了这些操作,它需要我们O(N ** 2)。

但是,如果我们使用二进制插入将元素插入到前导子列表中,则应该采用O(logn)时间,其中n是子列表的长度。基本上将新元素与前一个已排序子列表的中间元素进行比较,如果它大于中间元素,则新元素位于子列表的中间元素和最后一个元素之间。

当我们重复n项的操作时,它应该带我们O(N * logN)。我们可以使用二进制搜索方法,因为我们知道前一个子列表已经排序。

因此,最坏情况时间复杂度不应该是O(N * logN)而不是O(N ** 2)。

1 个答案:

答案 0 :(得分:2)

是的,你可以在O(log n)中找到插入点,但是你必须腾出空间来插入项目。这需要花费O(n)时间。

考虑这个部分排序的数组:

[1,2,3,5,6,7,9,4]

您到达最后一项4,然后进行二分查找以找到需要插入的位置。但是现在你必须创建空间,这意味着将项目9,7,6和5向下移动到阵列中的一个位置。这就是插入排序O(n ^ 2)的原因。