找到关键比较的数字C和移动的数量M.

时间:2013-12-30 05:07:46

标签: algorithm sorting performance processing-efficiency

我现在正在阅读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;他刚刚显示了已计算的CminMmax ...:

  

直接插入的分析。第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

1 个答案:

答案 0 :(得分:1)

C是比较次数,M是移动的数据项数。如果我们按照你的例子,在迭代1,有1个比较,没有移动。在迭代2中,有2个比较和2个移动。等等。现在,让我们考虑第k次迭代。将进行k次比较并假设您的确切点位于1到k的中间位置,将有k / 2次移动。 当k从1变为n时,数字C和M是所有比较和移动的总和。你所要做的就是将总和加起来,从1到n变化k,你就得到了数字。