`
chenzehe
  • 浏览: 532585 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

希尔排序算法分析及程序示例

阅读更多
实例说明

  用希尔排序方法对数组进行排序。


实例解析

  希尔排序 (Shell Sort) 是插入排序的一种。希尔排序基本思想是先取一个小于 n 的整数 d1 作为第一个增量,把文件的全部记录分成 d1 个组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量 d2<d1 重复上述的分组和排序,直至所取的增量 dt=1(dt<dt-1<…<d2<d1), 即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。


Shell 排序的算法描述如下 :

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[i]; j=i-d;   //R[0] 只是暂存单元,不是哨兵
      do{          // 查找 R[i] 的插入位置
        R[j+d]=R[j];   // 后移记录
        j=j-d;      // 查找前一记录
      }while(j>0 && R[0].key < R[j].key);
      R[j+d]=R[0];     // 插入 R[i] 到正确的位置上
    } //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 时,希尔排序和插入排序基本一致,只是由于没有哨兵而在内循环中增加了一个循环判定条件“ j> 0 ”,以防下标越界。


程序代码—希尔排序

#include <stdio.h>
#define MAX 255
int R[MAX];

void ShellPass(int d,int n){ /* 希尔排序中的一趟排序, d 为当前增量 */
   int i,j;
   for(i=d+1;i<=n;i++) /* 将 R[d+1..n] 分别插入各组当前的有序区 */
      if(R[i]<R[i-d]){
         R[0]=R[i]; j=i-d; /*R[0] 只是暂存单元,不是哨兵 */
         do{ /* 查找 R[i] 的插入位置 */
            R[j+d]=R[j]; /* 后移记录 */
            j=j-d; /* 查找前一记录 */
         }while(j>0 && R[0]<R[j]);
         R[j+d]=R[0]; /* 插入 R[i] 到正确的位置上 */
      }/*endif*/
}/*end of ShellPass*/

void Shell_Sort(int n){
   int increment=n; /* 增量初值,设 n>0*/
   do{
      increment=increment/3+1; /* 求下一增量 */
      ShellPass(increment,n); /* 一趟增量为 increment 的 Shell 插入排序 */
   }while(increment>1);
}/*ShellSort*/

void main(){
   int i,n;
   clrscr();
   puts("Please input total element number of the sequence:");
   scanf("%d",&n);
   if(n<=0 || n>MAX){
      printf("n must more than 0 and less than %d.\n",MAX);
      exit(0);
   }
   puts("Please input the elements one by one:");
   for(i=1;i<=n;i++)
      scanf("%d",&R[i]);
   puts("The sequence you input is:");
   for(i=1;i<=n;i++)
      printf("%4d",R[i]);
   Shell_Sort(n);
   puts("\n The sequence after shell_sort is:");
   for(i=1;i<=n;i++)
      printf("%4d",R[i]);
   puts("\n Press any key to quit…");
   getch();
}


归纳注释

  增量序列的选择:希尔排序的执行时间依赖于增量序列。好的增量序列的共同特征: ① 最后一个增量必须为 1; ② 尽量避免序列中的值 ( 尤其是相邻的值 ) 互为倍数的情况。有人通过大量的实验,给出了目前较好的结果:当 n 较大时,比较和移动的次数约在 n^( 1.25)~1.6n^( 1.25) 之间。

  希尔排序的时间性能优于直接插入排序,因为: ① 当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。 ② 当 n 值较小时, n 和 n^2 的差别也较小,即直接插入排序的最好时间复杂度 O(n) 和最坏时间复杂度 O(n^2) 差别不大。 ③ 在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量 di 逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按 di-1 作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接插入排序有较大的改进。

  稳定性:希尔排序是不稳定的。因为两个相同关键字在排序前后的相对次序发生了变化。
分享到:
评论

相关推荐

    Python排序搜索基本算法之希尔排序实例分析

    主要介绍了Python排序搜索基本算法之希尔排序,简单说明了希尔排序的原理并结合实例形式分析了Python实现希尔排序的具体操作技巧,需要的朋友可以参考下

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

     2.6 算法分析示例  2.7 保证、预测及局限性 第二部分 数据结构  第3章 基本数据结构  3.1 构建组件  3.2 数组  3.3 链表  3.4 链表的基本处理操作  3.5 链表的内存分配  3.6 字符串  3.7 复合...

    常用排序算法的C语言版实现示例整理

    基本的排序算法有如下几种:交换排序(冒泡排序、快速排序)、选择排序(直接选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、分配排序(基数排序、箱排序、计数排序)。下面依次列出各种算法的...

    《C算法》((美国)Robert Sedgewick)清晰版[DJVU] 第一卷

    2.6 算法分析示例 39 练习 43 2.7 保证、预测与限制 44 练习 46 第一部分参考文献 47 第二部分 数据结构 第3章 基本数据结构 49 3.1 基石 50 练习 57 3.2 数组 57 练习 63 3.3 链表 64 练习 69 3.4 基本表处理 70 ...

    《C算法》((美国)Robert Sedgewick)清晰版[DJVU] 第二卷

    2.6 算法分析示例 39 练习 43 2.7 保证、预测与限制 44 练习 46 第一部分参考文献 47 第二部分 数据结构 第3章 基本数据结构 49 3.1 基石 50 练习 57 3.2 数组 57 练习 63 3.3 链表 64 练习 69 3.4 基本表处理 70 ...

    《算法》中文版,Robert Sedgewick,塞奇威克

    1.4 算法分析 1.4.1 科学方法 1.4.2 观察 1.4.3 数学模型 1.4.4 增长数量级的分类 1.4.5 设计更快的算法 1.4.6 倍率实验 1.4.7 注意事项 1.4.8 处理对于输入的依赖 1.4.9 内存 1.4.10 展望 1.5 案例研究...

    数据结构习题答案(全部算法)严蔚敏版

    9.8 有关排序算法的C语言源程序 9.9 多路归并用于外排序的简介 习题九 第10章 文件 10.1 文件的基本概念 10.1.1 文件 10.1.2 外存储器及信息特点 10.2 文件的组织 10.2.1 顺序文件 10.2.2 散列文件 10.2.3...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    1.4 算法分析 1.4.1 科学方法 1.4.2 观察 1.4.3 数学模型 1.4.4 增长数量级的分类 1.4.5 设计更快的算法 1.4.6 倍率实验 1.4.7 注意事项 1.4.8 处理对于输入的依赖 1.4.9 内存 1.4.10 展望 1.5 案例研究...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    9.6 其他排序算法 9.6.1 枚举排序 9.6.2 基数排序 9.7 书目评注 习题 第10章 图算法 10.1 定义和表示 10.2 最小生成树:Prim算法 10.3 单源最短路径:Dijkstra算法 10.4 全部顶点对间的最短路径 10.4.1 ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料;本资料仅用于学习。 【课程内容】 第1周 开课介绍 python发展介绍 第一个python程序 ...归并排序 希尔排序 算法练习 栈和队列 数据结构其他

    java自学之道

    3.6希尔排序算法 3.7 二分查找算法 3.8 二叉树 3.9 图的实现 3.10 生产者消费者的实现 3.11 银行家算法 3.12 KMP算法 3.13 RSA的实现 第4章 IO流实例开发 4.1流到底怎样输入和输出扯淡区 4.2 FileInputStream的应用 ...

Global site tag (gtag.js) - Google Analytics