插入排序理论分析,总移位数。

时间:2017-08-18 17:13:19

标签: arrays algorithm sorting

给出以下数组:

[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(因为每个   内循环迭代恰好将一个元素移位一个位置。)

(这些行以下的任何内容都可以完全理解到最后。)

1 个答案:

答案 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。

希望它有所帮助!