有人能解释一下为什么插入排序的时间复杂度是Θ(n²)吗?
我相当确定我理解时间复杂度的概念,但我不太明白如何将其应用到这个排序算法上。我应该寻找数学证明来找到答案吗?
有人能解释一下为什么插入排序的时间复杂度是Θ(n²)吗?
我相当确定我理解时间复杂度的概念,但我不太明白如何将其应用到这个排序算法上。我应该寻找数学证明来找到答案吗?
平均每个插入操作必须遍历当前排序好的列表的一半,并在每一步中进行一次比较。列表每次增加一个元素。
因此,从长度为1的列表开始,并插入第一个项目以获得长度为2的列表时,我们平均需要遍历0.5(0或1)个位置。其他情况下的平均遍历次数为1.5(0、1或2个位置)、2.5、3.5,...,n-.5(列表长度为n+1时)。
通过简单的代数运算,可以得到:1 + 2 + 3 + ... + n - n * 0.5 = (n(n+1) - n)/2 = n^2/2 = O(n^2)
请注意,这是平均情况。在最坏情况下,列表必须完全遍历(您总是将下一个最小的项插入到升序列表中)。然后,您需要1 + 2 + ... + n,这仍然是O(n^2)。
在最好的情况下,您通过一次比较找到插入点,因此您需要1+1+1+(n次)= O(n)。
插入排序算法的最坏时间复杂度为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
O(1)
时间,交换需要O(1)
时间。您可以自行判断这是否是有效的指标。从那时起,只需应用定义即可。 - rliu