插入排序的时间复杂度

时间:2013-11-07 02:58:50

标签: sorting time-complexity insertion-sort

有人能解释为什么插入排序的时间复杂度为Θ(n²)吗?

我非常确定我将时间复杂性理解为一个概念,但我并不真正理解如何将其应用于此排序算法。我应该只看数学证据来找到这个答案吗?

3 个答案:

答案 0 :(得分:10)

平均每次插入必须遍历当前排序列表的一半,同时每步进行一次比较。该列表每次增长一个。

因此,从长度为1的列表开始并插入第一个项目以获得长度为2的列表,我们平均遍历.5(0或1)个位置。其余为1.5(0,1或2位),2.5,3.5,...,n-.5,长度为n + 1的列表。

这是通过简单代数,1 + 2 + 3 + ... + n - n * .5 =(n(n + 1) - n)/ 2 = n ^ 2/2 = O(n ^ 2)

请注意,这是一般情况。在最坏的情况下,列表必须完全遍历(您始终将下一个最小的项插入升序列表)。然后你有1 + 2 + ... n,它仍然是O(n ^ 2)。

在最好的情况下,您会在顶部元素处找到一个比较插入点,因此您有1 + 1 + 1 +(n次)= O(n)。

答案 1 :(得分:1)

它仅适用于数组/列表 - 即插入/删除时间为O(n)的结构。它可能与其他数据结构不同。例如,对于跳过列表,它将是O(n * log(n)),因为跳过列表中的O(log(n))中可以进行二进制搜索,但插入/删除将是常量。

答案 2 :(得分:1)

插入排序算法的最坏情况时间复杂度为O(n ^ 2)。 当数组中的元素已经按降序存储并且您想按升序对数组进行排序时,插入排序的最坏情况就会出现。

假设您有一个数组

Step 1 => | 4 | 3 | 2 | 1 | No. of comparisons = 1  |  No. of movements = 1 
Step 2 => | 3 | 4 | 2 | 1 | No. of comparisons = 2  |  No. of movements = 2
Step 3 => | 2 | 3 | 4 | 1 | No. of comparisons = 3  |  No. of movements = 3
Step 4 => | 1 | 2 | 3 | 4 | No. of comparisons = 4  |  No. of movements = 4

T(n)= 2 + 4 + 6 + 8 + ---------- + 2(n-1)

T(n)= 2 *(1 + 2 + 3 + 4 + -------- +(n-1))

T(n)= 2 *(n(n-1))/ 2

T(n)= O(n ^ 2)