May 10

希尔排序   不指定

felix021 @ 2007-5-10 22:11 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(6315) | Via 本站原创 | |
希尔排序  

希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。

希尔排序基本思想

基本思想:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2
该方法实质上是一种分组插入方法。

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

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

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次为:

5,3,1

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

Shell排序的算法实现

不设监视哨的算法描述


void ShellPass(SeqList R,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(SeqList R)

{

  int increment=n; //增量初值,不妨设n>0

  do
  {

    increment=increment/3+1; //求下一增量

    ShellPass(R,increment); //一趟增量为increment的Shell插入排序

  }while(increment>1)

} //ShellSort



注意:

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


算法分析

1.增量序列的选择

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

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

① 最后一个增量必须为1;

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

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

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

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

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



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
11
2009-4-3 09:52
stupid
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]