图14.1 直接插入排序示例
第14章 排序
n
Cmax=
=i (2+n)(n1)/2=O(n2)
i=2
n
Mmax= =i(4+n)(n1)/2=O(n2)
i=2
由上述分析可知,当记录关键字的分布情况不同时,算法 在执行过程中的时间消耗是有差异的。若在随机情况下,即关 键字可能出现的各种排列的概率相同,则可取上述两种情况的 平均值作为比较和记录移动的平均次数,约为n2/4。由此,直接 插入排序的时间复杂度为
第14存储结构,关键字为 整数,文件类型说明如下:
typedef struct
{
int key;
datatype other;
/* 定义记录为结构类型 */ /* 关键字域 */ /* 记录的其他域 */
} rectype; rectype R[n]; 其中:n为文件的记录总数。
如何选择增量序列才能产生最好的排序效果,这个问题至 今没有得到解决。希尔本人最初提出取d1=n/2,di+1=di/2, dt=1,t=log2n。后来又有人提出其他选择增量序列的方法,如 di+1=(di1)/3,dt=1,t=log3n1 以及di+1=(di1)/2,dt=1, t=log2n1。
第14章 排序
根据上述算法,我们用一例子来说明直接插入排序的过 程。设待排序的文件有八个记录,其关键字分别为47, 33, 61, 82, 72, 11, 25, 47,直接插入排序过程如图14.1所示。
直接插入排序的算法分析如下:
整个排序过程只有两种运算,即比较关键字和移动记录。 算法中的外循环表示要进行n1趟插入排序,内循环则表明每 一趟排序所需进行的关键字的比较和记录的后移。在文件正序 (即关键字递增有序)时,每趟排序的关键字比较次数为1, 记录移动次数是2次,即总的比较次数Cmin=n1,总的移动次 数Mmin=2(n1);当文件逆序时,关键字的比较次数和记录移 动次数均取最大值。对于要插入的第i个记录,均要与前i1个 记录及“监视哨”的关键字进行比较,即每趟要进行i次比较; 从移动记录的次数来说,每趟排序中除了上面提到的两次移动 外,还需将关键字大于R[i]的记录后移一个位置。因此,总的 比较次数和记录的移动次数为