我现在正在阅读N.Wirth - 算法和数据结构。 (Oberon version: August 2004)
问题: 他是如何计算这些C和M的?这个过程没有解释...... (任何帮助都会有用)
让我告诉你是什么问题......我遇到了以下情况:
2.2.1按直插方式排序
...通过计算数字 C 来获得效率的良好衡量标准 需要进行关键比较和 M 项目的移动(换位)。
他描述了该算法的工作原理:
PROCEDURE StraightInsertion;
VAR i, j: INTEGER; x: Item;
BEGIN
FOR i := 1 TO n-1 DO
x := a[i]; j := i;
WHILE (j > 0) & (x < a[j-1] DO a[j] := a[j-1]; DEC(j) END ;
a[j] := x
END
END StraightInsertion
......然后他讲述 C 和 M 。但他没有解释找到它们的过程 - &gt;他刚刚显示了已计算的Cmin
,Mmax
...:
直接插入的分析。第i次筛选中关键比较的数字 Ci 最多 i-1 ,至少 1 ,并且---假设 n 键的所有排列同样可能 - 平均值 i / 2 。移动的数量 Mi (项目的分配)是 Ci + 2 (包括哨兵)。因此,比较和移动的总数是:
Cmin = n-1 Mmin = 3*(n-1)
Cave = (n^2 + n - 2)/4 Mave = (n^2 + 9n - 10)/4
Cmax = (n^2 + n - 4)/4 Mmax = (n^2 + 3n - 4)/2
所以问题是: 他是如何计算这些 C 和 M 的?他没有解释找到所有这些数字的过程。你能帮我理解如何找到它们吗?任何帮助都会很好。
PS 我一直在寻找有关这个主题的信息,但没有结果。
此外:
以下是随机选择的八个数字示例中显示的插入过程(如果需要):
Initial Keys: 44 55 12 42 94 18 06 67
v
i=1 44 55 12 42 94 18 06 67
v
v-----<
i=2 12 44 55 42 94 18 06 67
v
v-----<
i=3 12 42 44 55 94 18 06 67
v
i=4 12 42 44 55 94 18 06 67
v
v-----------<
i=5 12 18 42 44 55 94 06 67
v
v-----------------<
i=6 06 12 18 42 44 55 94 67
v
v--<
i=7 06 12 18 42 44 55 67 94
答案 0 :(得分:1)
C是比较次数,M是移动的数据项数。如果我们按照你的例子,在迭代1,有1个比较,没有移动。在迭代2中,有2个比较和2个移动。等等。现在,让我们考虑第k次迭代。将进行k次比较并假设您的确切点位于1到k的中间位置,将有k / 2次移动。 当k从1变为n时,数字C和M是所有比较和移动的总和。你所要做的就是将总和加起来,从1到n变化k,你就得到了数字。