插入排序在已经排序的2元素数组中进行了多少次比较?

时间:2016-02-17 06:05:51

标签: arrays algorithm sorting insertion-sort

插入排序的最佳情况是O(n),但是,如果数组中有2个元素已经排序,例如10和11,那么它只进行一次比较而不是2?

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的极限)。