希尔排序算法
从根本上而言是对插入排序算法的一种改进。
基本思想:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
直接插入排序的作法是:
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
希尔排序算法实现:
void ShellPass(List R, int d)
{//希尔排序中的一趟排序,d为当前增量
for (i = d + 1; i <= n; i++) //将R[d+1..n]分别插入各组当前的有序区
if (R[i].key < R[i - d].key)
{
R[0] = R; j = i - d;//R[0]只是暂存单元,不是哨兵
do
{//查找R的插入位置
R[j + d] = R[j];//后移记录
j = j - d;//查找前一记录
}
while (j > 0 && R[0].key < R[j].key); R[j + d] = R[0];
//插入R到正确的位置上
} //endif
} //ShellPass
void ShellSort(List R)
{
int increment = n;
//增量初值,不妨设n>0
do
{
increment = increment / 3 + 1;//求下一增量
ShellPass(R, increment);//一趟增量为increment的Shell插入排序
} while (increment > 1);
} //ShellSort