【问题标题】:Can someone explain to me why the worst case for insertion sort is O(n^2)?有人可以向我解释为什么插入排序的最坏情况是 O(n^2) 吗?
【发布时间】:2014-02-08 07:36:51
【问题描述】:

在找到插入排序的最坏情况分析时,有人可以逐步解释我们如何得到 O(N^2) 吗?我目前正在阅读 Cormen Intro to Algorithms 一书中的解释,但解释有点令人困惑。

【问题讨论】:

标签: algorithm sorting big-o insertion-sort


【解决方案1】:

简而言之,最坏情况是您的列表与您需要的完全相反的顺序。在这种情况下:

  • 当然,对于第一项,您进行了 0 次比较。
  • 对于第二个项目,你将它与第一个项目进行比较,发现它们的位置不对;您进行了 1 次比较。
  • 对于第三个,将其与两者进行比较,发现第三个必须到顶部。您进行了 2 次比较。
  • 继续;对于以下每个值,您再进行一次比较。
  • 最后,对于第 n 个项目,您进行 n - 1 次比较。

如果您将最坏情况下的比较次数加起来,您会发现它是0 + 1 + 2 + ... + n-1,它等于(n^2 - n) / 2 最坏情况下的比较次数,即是 O(n^2)。 (决定复杂度的部分是当我们考虑大n时,在这种情况下n^2项占主导地位)

【讨论】:

  • 是的,我知道出了什么问题。我没有完全理解插入排序是如何工作的,这就是我感到困惑的原因。我在想,每次将一个元素放在正确的位置时,数组都会再次从头开始并比较每个元素(包括已经排序的元素)。这显然没有意义
  • 啊,我明白了。老实说,在看到您的问题之前,我不知道插入排序是什么,而我只是偶然发现了我在给您留下的评论中添加的链接。我为我和你一样回答了你的问题。
【解决方案2】:

插入排序在几乎已排序的输入上工作得很快,因此要进行最坏情况分析,您可以使用数字降序排列的数组。 好像数字是按降序排列的,那么您需要在第 i 次迭代中移动 (i-1) 个数字,因此 T(n) = sum(i-1) for i in range(1,n) = n*(n-1)/2 = O(n^2)

【讨论】:

    【解决方案3】:

    让伪代码:

    for i = 1 to length(A)
        x = A[i]
        j = i - 1
        while j >= 0 and A[j] > x
            A[j+1] = A[j]
            j = j - 1
        end while
        A[j+1] = x
     end for 
    

    插入排序的复杂性

    插入排序在最佳情况下以 O(n) 时间运行,在最坏和平均情况下以 O(n^2) 时间运行

    最佳案例分析:

    插入排序执行两个操作:它扫描列表,比较每对元素,以及交换元素如果它们不在秩序。每个操作都会影响算法的运行时间。

    如果输入数组已经排好序,插入排序比较O(n)个元素并执行无交换(在伪代码中上面,永远不会触发内部循环)。 因此,在最好的情况下,插入排序在 O(n) 时间内运行。

    最坏情况和平均情况分析:

    当输入列表按降序排列时,会发生插入排序的最坏情况。 要插入最后一个元素,我们需要最多 n-1 个比较最多 n-1 个交换。要插入 第二个到最后一个元素,我们需要最多n-2次比较最多n-2次交换,依此类推。操作次数因此,执行插入排序所需的为:2 × (1+2+⋯+n−2+n−1)

    要计算此算法的递归关系,请使用以下命令:

    2(n-1)(n-1+1)/2 =n(n-1)

    使用主定理解决此递归运行时间。不出所料,算法的复杂度是O(n^2)

    在分析算法时,平均情况通常与最坏情况具有相同的复杂性。因此,插入排序平均需要 O(n^2) 时间。

    插入排序具有快速的最佳情况运行时间,并且是一种很好的排序算法,如果输入列表已经大部分排序。对于更大或更多的无序列表,具有最坏和平均情况运行时间的算法(例如合并排序)会更好选择。

    插入排序是一种空间复杂度为 O(1) 的稳定排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多