给出以下数组:
[14 17 21 34 47 19 71 22 29 41 8]
以下摘录自Thomas Cormen的“算法解锁”一书 (略微编辑,[START]和[STOP]标志不是文本的一部分):
当阵列开始时,插入排序是一个很好的选择 ''几乎排序''。 [START] 假设每个数组元素都在其中开始 k在排序数组中最终的位置。然后总计 所有迭代中给定元素移位的次数 内环的最多为k。因此,总次数 所有元素都在所有内循环迭代中移位,是 大多数kn,它反过来告诉我们内循环的总数 迭代最多是kn(因为每个内循环迭代都会发生变化) 正好一个元素一个位置。 [STOP] 如果k是一个常数,那么 插入排序的总运行时间仅为Θ(n),因为 Θ-表示法包含常数因子k。事实上我们甚至可以 容忍一些在阵列中移动很长距离的元素,只要 没有太多这样的元素。特别是,如果L元素可以 移动数组中的任何位置(以便这些元素中的每一个都可以移动 最多n-1个位置),其余的n-L元素可以更多 大多数k个位置,然后总移位数最多L *(n - 1)+(n - L)* k =(k + L)* n - (k + 1)* L,如果两者都是Θ(n) 和L是常数。
这本书试图解释它如何制作一个公式,它在文本的底部呈现。我想帮助更好地理解它所说的内容,很可能,它可以帮助使用上面的示例数组的特定示例,以便k和n变量发生了什么。你能帮助我更好地理解上面摘录的分析吗?
更具体地说是令我困惑的是,[START]和[STOP]标志之间的界限,这些是以下几行:
假设每个数组元素.....反过来告诉我们 内循环迭代的总数最多为kn(因为每个 内循环迭代恰好将一个元素移位一个位置。)
(这些行以下的任何内容都可以完全理解到最后。)
答案 0 :(得分:1)
我们考虑插入排序算法
算法:InsertionSort(A)
i ← 1
while i < length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
end while
i ← i + 1
end while
内部循环 - 逐个移动A [0..i-1]的元素,直到A [i]处于正确位置。 因此,如果给定元素距离其正确位置最远的k位置,我们将具有最大k比较和交换。对于n个元素,它将是k * n。
希望它有所帮助!