希尔排序是怎么排的呀??

来源:百度知道 编辑:UC知道 时间:2024/05/27 06:50:45
比如,1 5 3 7 18 6 2 9 4
如果d是3,则分组为{1 7 2}{5 18 9}{3 6 4}
这是为什么呀??我不懂呢!
还有书本上说。“设一个d,然后把所有距离是d倍数的记录放一组”这又是要怎么判断呀???大家帮帮我哦~谢谢

d是3,意思就是把位置为1+3*0,1+3*1,1+3*2……放在一起
2+3*0,2+3*1,2+3*2……放在一起
3+3*0,3+3*1,3+3*2……放在一起

希尔排序 希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。
希尔排序基本思想
基本思想:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1
排序过程如【动画模拟演示】。
Shell排序的算法实现
1. 不设监视哨的算法描述
void ShellPass(SeqList 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(SeqList R)
{