插入排序的运行时分析

时间:2016-09-08 20:23:05

标签: algorithm sorting insertion

我正在尝试计算此插入排序算法的运行时分析:

1) n = length[A]
2) count = 0
3) for (i=1; i<=n; i++)
4)     for (j=1; j<=i; j++)
5)         if A[j] <= 100
6)              for (k=j; k<=j+2*i; k++)
7)                  A[j] = A[j]-1
8)                  count = count+1
9) return (count) 

我在youtube上观看了一些视频:https://www.youtube.com/watch?v=tmKUHLs21PU 我也读过书,我在网上找不到任何类似的东西(因为有3个嵌套的for循环和if语句)。

现在我很高兴直到大约5岁。

据我所知,第3行的运行时为 n ,对于4,Σj= 1到n(tj)

之后我完全迷失了,我知道'Σ涉及if语句和3rd for循环。有人可以详细解释下一步该做什么以及为什么会这样。谢谢。

1 个答案:

答案 0 :(得分:0)

这听起来很像一个家庭作业问题,它不会给你任何好处,只是给你所有的答案,但这里有一些原则,可以帮助你自己找出其余部分。

第4行将在第一次通过外循环时发生,第二次发生两次,依此类推,在第n次循环中发生n次。

1 + 2 + ... + n 

如果我们重新排列这些以将第一个和最后一个加数放在一起,那么第二个和倒数第二个,我们会看到一个模式:

1 + 2 + ... (n-1) + n 
= (n + 1) + (n - 1 + 2) + ... + (n - n/2 + n/2 + 1)
= (n + 1) + (n + 1) + ... + (n + 1)
= (n + 1) * n/2
= n²/2 + n/2

就渐近复杂度而言,常量1/2n超过,因此第4行的大O是

第5行必须与第4行一样进行多次评估,无论其评估结果如何,因此A[j]。但是它内部的行数运行次数取决于数组中的值。这是您开始遇到最佳情况和最坏情况复杂性的地方。

在最好的情况下,数组中的值总是大于100,因此整个算法的复杂性等于第5行的复杂性。

在最坏的情况下,for中的值将始终小于或等于100,因此将评估第6行上的100循环,从而增加整体算法的复杂性。< / p>

我将让您弄清楚剩余的线条将如何影响整体复杂性。

顺便说一下,这对我来说并不像插入排序。它不会将数组值相互比较并将它们的位置交换到数组中。它将数组值与常量(getObjectByName)进行比较,并根据它们在数组中的位置减少它们的值。