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

How many comparisons does insertion sort do in an already-ordered 2-element array?

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

如果输入已经排序,插入排序会进行 N - 1 次比较。

这是因为对于每个元素,它都会将它与前一个元素进行比较,如果顺序不正确,它就会做一些事情(现在做什么并不重要,因为顺序总是正确的)。所以你会这样做 N - 1 次。

看来你得懂个big O notation。因为O(n)不代表n次操作,甚至不代表接近n次操作(n/10^9是O(n),并没有真正接近n)。所有这一切都意味着该函数近似线性(将其视为 n-> inf 的极限)。

时间复杂度O(n)并不是说步数正好是n,而是说步数步骤由线性函数支配。基本上,对大量元素进行排序应该最多花费两倍的时间。

插入排序的最佳情况是您可以在一次比较后插入新元素。只有两种情况会发生这种情况:

  • 您正在从反向排序列表中插入元素,并将新元素与目标列表的第一个元素进行比较。

  • 您正在从排序列表中插入元素,并将新元素与目标列表的最后一个元素进行比较。

在这 2 种情况下,每个新元素仅在一次比较后插入,包括您提到的情况。

对于这些非常特殊的情况,时间复杂度确实是 O(n)。对于这种复杂性,您不需要这种有利的情况,如果比较次数的上限与列表长度无关,则时间复杂度将为 O(n)

请注意,尝试以优化的方式处理排序列表是一种常见的优化。如果上面第二段提到的优化没有实现,排序一个已经排序的列表将是最坏的情况,用 n 比较插入第 n+1 个元素。

在一般情况下,列表上的插入排序的时间复杂度为 O(n2),但仔细实施会产生已排序列表的最佳解决方案。

请注意,对于在任何位置插入具有恒定成本的列表,这是正确的,数组上的插入排序没有此 属性。它仍然可以优化以处理这些特殊情况,但不能同时处理这两种情况。