我试图了解插入排序的时间复杂度。我被困在while循环中。我不知道执行循环多少次
InsertionSort(A)
for j = 2 to A.length
key = A[j]
i = j - 1
while i>0 and A[i]>key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
我知道for循环执行n + 1次,循环中的每个语句执行n次 while循环也执行n次 但是,我不明白的是“ while循环下的语句在最坏情况和最佳情况下都执行了多少次?”
答案 0 :(得分:2)
在最坏的情况下,A
会以降序排列,这意味着对于第j
个条目,内部循环将运行j
次(给出或取“ +1”或“ -1” ...)。令人高兴的是,有一个公式可以作为Gauss famously found out spontaneously and under duress,将1
到n
的所有数字相加得出n*(n+1)/2
的结果。
由于我们只关心复杂度,而不关心实际值,因此可以忽略常数和乘法因子,最后得到O(n^2)
。
开玩笑地说,当内部循环计数线性限制时,在循环中存在循环的事实强烈表明O(n^2)
。
最好的情况是,A
已按升序排序,根本不会输入内部循环,而总体复杂度将为O(n)
。
平均情况在很大程度上取决于您预期的“无序性”状态。例如,如果您的列表基本上总是已经排序,并且只有很少,非常本地的切换,则排序将表现得很好。