插入排序的时间复杂度

时间:2019-03-29 16:39:04

标签: algorithm time-complexity insertion-sort

我试图了解插入排序的时间复杂度。我被困在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循环下的语句在最坏情况和最佳情况下都执行了多少次?”

1 个答案:

答案 0 :(得分:2)

在最坏的情况下,A会以降序排列,这意味着对于第j个条目,内部循环将运行j次(给出或取“ +1”或“ -1” ...)。令人高兴的是,有一个公式可以作为Gauss famously found out spontaneously and under duress,将1n的所有数字相加得出n*(n+1)/2的结果。

由于我们只关心复杂度,而不关心实际值,因此可以忽略常数和乘法因子,最后得到O(n^2)

开玩笑地说,当内部循环计数线性限制时,在循环中存在循环的事实强烈表明O(n^2)

最好的情况是,A已按升序排序,根本不会输入内部循环,而总体复杂度将为O(n)

平均情况在很大程度上取决于您预期的“无序性”状态。例如,如果您的列表基本上总是已经排序,并且只有很少,非常本地的切换,则排序将表现得很好。