Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308383
  • 博文数量: 273
  • 博客积分: 5865
  • 博客等级: 准将
  • 技术积分: 3280
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-11 10:01
文章分类

全部博文(273)

文章存档

2015年(33)

2014年(11)

2013年(11)

2012年(136)

2011年(32)

2010年(50)

分类:

2012-09-12 12:42:47

原文地址:shell排序法 作者:lc0060305

shell排序法又称为增量排序法,它属于插入排序法的一种。它的基本思想是,在多趟排序中,设置不同的增量,增量从大到小,最后的增量设置为1,如......5,3,1。最终完成排序。它的实质是将数据进行分组插入排序。

例如有下列一组数字进行shell排序:
81  94  11  96  12  35  17  95  28  58  41  75  15

设第一趟增量为 5,        81  94  11  96  12  35  17  95  28  58  41  75  15
第一趟排序后,              35  17  11  28  12  41  75  15  96  58  81  94  95

设第二趟增量为 3,        35  17  11  28  12  41  75  15  96  58  81  94  95
第二趟排序后,              28  12  11  35  15  41  58  17  94  75  81  96  95

设第三趟增量为 3,        28  12  11  35  15  41  58  17  94  75  81  96  95
第三趟排序后,              11  12  15  17  28  35  41  58  75  81  94  95  96

shell算法的运行时间与所设增量有密切的关系。一般情况下使用素数做为增量,如1,3,5,7,11......

算法:
void shellpass(int dt, int arr[], int N)
{
    int i,j;
    int tmp;
   
    for(i=dt; i<=N;i++)
    {
        tmp = arr[i];
        for(j = i; j>dt && arr[j] >tmp; j-=dt)
            arr[j] = arr[j-dt];
        arr[j] = tmp;
    }

  }

  void  shellsort(int arr[], int N)
  {
      do {
          increment=increment/3+1;     //求下一增量
          shellpass(increment, arr[], N); //一趟增量为increment的Shell插入排序
       }while(increment>1)
  }
阅读(697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~