题目

插入排序法由未排序的后半部前端取出一个值。插入已排序前半部的适当位置。概念简单但速度不快。

排序要加快的基本原则之中的一个:

是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,Shell排序法即是基于此一概念来改良插入排序法。

解法

Shell排序法最初是D.L Shell于1959所提出,如果要排序的元素有n个,则每次进行插入排序时并非全部的元素同一时候进行时,而是取一段间隔。

Shell排序算法 – n/2间隔

Shell首先将间隔设定为n/2,然后跳跃进行插入排序,再来将间隔n/4。跳跃进行排序动作,再来间隔设定为n/8、n/16,直到间隔为1之后的最后一次排序终止。

Shell排序算法 – Sedgewick间隔

将间隔设定为n / 2是D.L Shell最初所提出,在教科书中使用这个间隔比較好说明,然而Shell排序法的关键在于间隔的选定。比如Sedgewick证明选用下面的间隔能够加 快Shell排序法的速度:

e.g 对于一个长度为10000的整型数组,

Swedge[0]=10000, Swedge[1]=2537, Swedge[2]=653, Swedge[4]=48,Swedge[5]=15…Swedge[8]=1

採用Swedge间隔须要迭代8次 (Swedge[0] 不使用)

而用普通Shell间隔须要迭代13次

Comsh [0]=10000, Comsh [1]=5000, Comshe[2]=2500, Comsh[4]=625,…..Comshell[8]=39, Comshell[13]=1

后来还有人证明有其他的间隔选定法能够将Shell排序法的速度再加快;另外Shell排序法的概念也能够用来改良气泡排序法。

SourceCodes

n/2间隔与Sedgewick间隔的 Shell排序

int DLShellSort(int a[],int lens)
{for(int gap=lens/2;gap>0;gap/=2){InsertionSortWithGap(a,lens,gap);}return 0;
}// 4*((2^j)^2)+3*(2^j)+1<=n
// j= log(((-3+sqrt(16*lens-7.0))/8))/log(2.0)
int SedgewickShellSort(int a[],int lens)
{int sdwindex= (int)log(((-3+sqrt(16*lens-7.0))/8))/log(2.0);int sdwpr=(int)pow(2,(double)sdwindex);int sdwpr2=sdwpr/2;while(true){int sdwgap=4*sdwpr2*sdwpr2+3*sdwpr2+1;InsertionSortWithGap(a,lens,sdwgap);sdwpr2/=2;if(sdwpr2<=1)break;}return 0;
}

见 [3] 算法之路 - 插入排序

// 插入排序 使用指定间隔的
int InsertionSortWithGap(int a[],int lens,int gap)
{int k,tmp;// 控制插入层for(int m=0;m<gap;m++){for(int i=gap+m;i<lens;i+=gap){int j=i-gap;tmp=a[i];for(k=j;k>=0;k-=gap){if(tmp<a[k]) a[k+gap]=a[k];else break;}if(i!=(k+gap))a[k+gap]=tmp;}}return 0;
}

转载于:https://www.cnblogs.com/blfbuaa/p/7338101.html

[4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔相关推荐

  1. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  2. 算法之路——插入排序篇3:希尔排序

    前面的所有排序(直接插入排序,这般插入排序,表插入排序)都是逐个的将下一个元素插入前面已经排序了的列表中,这就比避免不了排序中一些较"大"的数据,开始时却在前面的数据会被进行大量的 ...

  3. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  4. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  5. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现分享

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  6. 插入排序和Shell排序

    本文为自己的学习笔记,如果有语义错误请及时指正谢谢, 插入排序 插入排序是对未排序数据在有序数据中找位置插入的过程,如下图 排序流程 首先对前两个数据进行比较大小,然后确定这两个元素的顺序 然后将未排 ...

  7. 支持向量机(SVM):超平面及最大间隔化、支持向量机的数学模型、软间隔与硬间隔、线性可分支持向量机、线性支持向量机、非线性支持向量机、核函数、核函数选择、SMO算法、SVM vs LR、优缺点

    支持向量机(SVM):超平面及最大间隔化.支持向量机的数学模型.软间隔与硬间隔.线性可分支持向量机.线性支持向量机.非线性支持向量机.核函数.核函数选择.SMO算法.SVM vs LR.优缺点 目录

  8. 会计转行算法之路(一)会计转程序员

    会计转行算法之路(一)会计转程序员 回忆起来,要感谢互联网,感谢开源,没有互联网,就没有我的今天,我也就无法走上自己的追梦之路. 每次迷茫的时候,回忆一下初心,我的理想是什么? 通过科学技术,改善人们 ...

  9. 简单插入排序,折半插入排序和2路插入排序 c源码

    以下三种插入排序时间复杂度均为O(n^2) 简单插入排序,简单直接.假定数组有序,插入 i, 从后往前遍历找到适合位置 j,移动 j +1 ~ i -1往后一位,插入i到j中. void insert ...

最新文章

  1. python编译成exe速度会变快吗_python如何编译成exe
  2. Google Maps Android API V2的使用及问题解决
  3. python工程师薪资坑吗-最新Python面试经验总结,避免采坑的进来
  4. 实战SSM_O2O商铺_31【商品】商品添加之View层的实现
  5. 论文小综 | 知识图谱中的复杂查询问答
  6. 【Elasticsearch】索引 强制合并 缓存 refresh flush 等操作
  7. php处理文件属性函数,文件属性 · PHP文件系统操作常用函数整理 · 看云
  8. html让时间只展示年月日_JS 如何动态显示当前年月日时分秒-百度经验
  9. 医院药品管理系统源码 HIS系统源码
  10. ktv收银管理系统服务器,ktv收银管理系统.pdf
  11. Vivado 2019使用教程
  12. Java服务器开发之搭建游戏基础框架
  13. Bootstrap系列之折叠(Collapse)
  14. android inflate,Android LayoutInflater inflate() 图示详解
  15. 【C++零散】计时chrono
  16. 「面向信仰编程」Draven 专访:像写代码一样,用树形的结构写文章
  17. pip uninstall
  18. js版身份证省市性别查询
  19. OSPF之LSA详解
  20. Dubbox框架使用手册

热门文章

  1. mysql left join 空值_MYSQL Left Join如何选择NULL值?
  2. android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications
  3. yii框架的下拉框多选,设置默认值等(dropDownList)
  4. react native利用webvView嵌入h5页面以及RN与webView的通信
  5. 【408预推免复习】计算机组成原理之指令系统
  6. python【数据结构与算法】程序设计:划分整数(DP)
  7. python【蓝桥杯vip练习题库】ADV-298 和谐宿舍2(DP)
  8. python【蓝桥杯vip练习题库】ADV-187 勾股数
  9. 【深度学习笔记】Precision、Recall
  10. java根据日期生成表主键_java 利用时间生成主键