插入排序的最佳情况是O(n),但是,如果数组中有2个元素已经排序,例如10和11,那么它只进行一次比较而不是2?
答案 0 :(得分:1)
O(n)的时间复杂度并不意味着步数正好 n ,这意味着步数由线性函数支配。基本上,对于大数字,排序两倍的元素应该最多花费两倍的时间。
插入排序的最佳情况是,只需进行一次比较即可插入新元素。这种情况只发生在两种情况下:
您正在从反向排序列表中插入元素,并将新元素与目标列表的第一个元素进行比较。
您正在从排序列表中插入元素,并将新元素与目标列表的最后一个元素进行比较。
在这两种情况下,每个新元素仅在一次比较后插入,包括你提到的情况。
对于这些非常特殊的情况,时间复杂度确实是 O(n)。对于这种复杂性,您不需要这种有利的情况,如果独立于列表长度的比较数存在恒定的上限,则时间复杂度将为 O(n)。
请注意,尝试以优化的方式处理排序列表是一种常见的优化方法。如果没有实现上面第二段中提到的优化,那么对已经排序的列表进行排序将是最糟糕的情况,n
比较插入n+1
元素。
在一般情况下,列表上的插入排序的时间复杂度为 O(n 2 ),但仔细实施可以为已排序的列表生成最佳解决方案。
请注意,对于在任何位置插入具有常量成本的列表,情况都是如此,数组上的插入排序没有此属性。它仍然可以进行优化以处理这些特殊情况,但不能同时处理这两种情况。
答案 1 :(得分:0)
如果输入已经排序,则插入排序会进行N - 1
比较。
这是因为对于每个元素,它将它与前一个元素进行比较,并且如果顺序不正确则执行某些操作(现在它不重要,因为顺序总是正确的)。所以你会N - 1
次这样做。
所以看起来你必须要理解big O notation。由于O(n)
并不意味着n
操作,因此它甚至不意味着接近n个操作(n/10^9
是O(n)并且它实际上并不接近n
)。这一切都意味着函数近似线性(将其视为n-> inf的极限)。