分析此短代码的时间复杂度

时间:2019-03-30 08:02:44

标签: time-complexity big-o bubble-sort

我正在尝试评估这几行代码的运行时复杂度,这是一个冒泡排序代码。 现在我知道它是O(n ^ 2),但我想做一个准确的分析。 我不确定我做对了

for i ← 1 to n-1
    for j ← n downto i+1
      if A[j-1] > A[j]
          temp ← A[j-1]
          A[j-1] ← A[j]
          A[j] ← temp

我所做的是: 第一行执行了n次,所以(c1)* n 第二行取决于i,但是它将是n,然后是n-1,...,1 那就是我的问题所在,我应该对i使用求和吗?似乎很奇怪,运行时取决于我 第三行也取决于我们得到的数组,而下一行也取决于我们。

任何人都可以帮助您进行适当的分析吗? 谢谢你。

1 个答案:

答案 0 :(得分:0)

对于i的每个值,代码执行许多取决于i的操作,例如c(i)。因此,总操作量为

total := sum_{i=1}^{n-1} c(i)

现在让我们为通用c(i)计算i。在最坏的情况下,if语句的真实分支始终执行并执行C操作,该操作的数量独立于ji和{{ 1}}。所以

n

因此

c(i) <= sum_{j=n}^{i+1} C
      = C*(n - (i+1) + 1)
      = C*(n - i)

请注意,在最佳情况下,total <= sum_{i=1}^{n-1} C*(n-i) = C * sum_{i=1}{n-1} (n-i) = C * n(n-1)/2 = O(n^2) 的真实分支将永远不会发生,您只需要采取计算不等式所需的操作数即可,例如if。因此,您可以重复进行相同的计算,然后再将D替换为C,将D替换为<=以获得

>=