【发布时间】:2018-04-09 08:54:41
【问题描述】:
您好,我是算法新手,对它非常着迷。
我试图找出插入排序的最坏情况时间复杂度,它被称为 O(n**2)。相反,我们可以将时间复杂度设为 O(N*logN)。
这是我的解释,
插入排序查看第一个元素并假定它已排序。接下来,它查看第 2 个元素并与 1 个元素的前导排序子列表进行比较,并根据与前导排序子列表中的元素的比较将其插入。类似地重复此过程。
到处都提到将一个元素插入到前一个排序的子列表中,基本上是线性搜索,它需要 O(N) 时间,因为我们对 n 个元素执行这些操作需要 O(N**2)。
但是,如果我们使用二进制插入将元素插入到前驱子列表中,则需要 O(logn) 时间,其中 n 是子列表的长度。基本上将新元素与前一个排序子列表的中间元素进行比较,如果它大于中间元素,则新元素位于中间元素和子列表的最后一个元素之间。
当我们对 n 个项目重复操作时,它应该花费我们 O(N*logN)。我们可以使用二分查找方法,因为我们知道先行子列表已排序。
所以最坏情况的时间复杂度不应该是 O(N*logN) 而不是 O(N**2)。
【问题讨论】:
-
是的,这是一个副本。但不幸的是,只有一个答案在前半部分是错误的(正如该答案下方的评论所解释的那样)并且在第二部分是正确的(复杂性来自移动元素)
-
@RaymondChen 考虑到负分接受的答案,最好将该问题作为该问题的副本关闭。