【发布时间】:2014-02-08 07:36:51
【问题描述】:
在找到插入排序的最坏情况分析时,有人可以逐步解释我们如何得到 O(N^2) 吗?我目前正在阅读 Cormen Intro to Algorithms 一书中的解释,但解释有点令人困惑。
【问题讨论】:
-
也许this site 会有所帮助。
标签: algorithm sorting big-o insertion-sort
在找到插入排序的最坏情况分析时,有人可以逐步解释我们如何得到 O(N^2) 吗?我目前正在阅读 Cormen Intro to Algorithms 一书中的解释,但解释有点令人困惑。
【问题讨论】:
标签: algorithm sorting big-o insertion-sort
简而言之,最坏情况是您的列表与您需要的完全相反的顺序。在这种情况下:
如果您将最坏情况下的比较次数加起来,您会发现它是0 + 1 + 2 + ... + n-1,它等于(n^2 - n) / 2 最坏情况下的比较次数,即是 O(n^2)。 (决定复杂度的部分是当我们考虑大n时,在这种情况下n^2项占主导地位)
【讨论】:
插入排序在几乎已排序的输入上工作得很快,因此要进行最坏情况分析,您可以使用数字降序排列的数组。
好像数字是按降序排列的,那么您需要在第 i 次迭代中移动 (i-1) 个数字,因此 T(n) = sum(i-1) for i in range(1,n) = n*(n-1)/2 = O(n^2)
【讨论】:
让伪代码:
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) 的稳定排序。
【讨论】: