设为首页 收藏本站
查看: 1308|回复: 0

希尔排序(Shell Sort)

[复制链接]

尚未签到

发表于 2015-10-26 01:37:46 | 显示全部楼层 |阅读模式
希尔排序(Shell Sort)是插入排序的一种。因DLShell1959年提出而得名。



希尔排序基本思想



  
基本思想:

    
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

   
 该方法实质上是一种分组插入方法。



给定实例的shell排序的排序过程



   
 假设待排序文件有10个记录,其关键字分别是:

        49
386597761327495504

   
 增量序列的取&#20540;依次为:

        5
31

   
 排序过程如【动画模拟演示】。



Shell排序的算法实现



1

不设监视哨的算法描述


  
void ShellPass(SeqListR,int d)
{//希尔排序中的一趟排序,d为当前增量
for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区
if(R.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(SeqListR)
{
int increment=n; //增量初值,不妨设n>0
do {
increment=increment/3+1; //求下一增量
ShellPass(R,increment); //一趟增量为increment的Shell插入排序
}while(increment>1)
} //ShellSort



  
注意:

    
当增量d=1时,ShellPassInsertSort基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件&quot;j>0&quot;,以防下标越界。



2
.设监视哨的shell排序算法

   
 具体算法【参考书目[12]




算法分析



1
.增量序列的选择


   
 Shell排序的执行时间依赖于增量序列。

   
 好的增量序列的共同特征:

  
最后一个增量必须为1

  
应该尽量避免序列中的&#20540;(尤其是相邻的&#20540;)互为倍数的情况。

   
 有人通过大量的实验,给出了目前较好的结果:当n较大时,比较和移动的次数约在nl.251.6n1.25之间。



2
Shell排序的时间性能优于直接插入排序

   
 希尔排序的时间性能优于直接插入排序的原因:

  当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。

  n&#20540;较小时,nn2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。

  在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。

   
 因此,希尔排序在效率上较直接插人排序有较大的改进。



3
.稳定性

   
 希尔排序是不稳定的。参见上述实例,该例中两个相同关键字49在排序前后的相对次序发生了变化。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-130696-1-1.html 上篇帖子: 子shell的$$ 下篇帖子: Shell中EOF的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表