题目

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

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

是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,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;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdml2aXR1ZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

[4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔的更多相关文章

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

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

  2. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  3. 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)

    2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...

  4. 算法:希尔排序(Shell Sort)

    背景 在三种简单的排序算法中(冒泡.选择和插入)插入排序的算法最好,不过插入过程可能需要进行大量的移动,如何尽可能少的移动元素呢?希尔排序正是基于对这个问题的思考而想出来的,考虑到希尔排序对已排序数组 ...

  5. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  7. 《算法导论》插入排序----InsertSort

    算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...

  8. JavaScript ,Python,java,C#,Go系列算法之【插入排序篇】

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法. ...

  9. 【DS】排序算法之希尔排序(Shell Sort)

    一.算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作 ...

随机推荐

  1. Android--全局变量 很好很强大

    As you know, each Activity is also a Context, which is information about its execution environment i ...

  2. sqlserver学习笔记(一)—— 登录本机sqlserver、启动和停止sqlserver服务、创建和删除数据库

    (重要参考:51自学网——SQL Server数据库教程) 首先按照网上教程安装好sqlserver,打开登录 登录本机sqlserver:①. ②localhost ③127.0.0.1 启动和停止 ...

  3. java工具类之按对象中某属性排序

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  4. oracle 错误码查看命令oerr ora及常用错误码总结--不断更新

    oracle 错误码查看命令oerr ora及常用错误码总结--不断更新 1.ORA-00907: 缺失右括号 我自己的问题出在 字段的default 和 not null 顺序反了,defalut ...

  5. CentOS 7 下挂载NTFS文件系统并实行开机自动挂载

    CentOS 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单. 首先要进入官网下载NTFS-3G工具 http://www. ...

  6. Linux iptables常用命令

    iptables 是 Linux 中重要的访问控制手段,是俗称的 Linux 防火墙系统的重要组成部分.这里记录了iptables 防火墙规则的一些常用的操作指令. 下面的操作以 CentOS 为基础 ...

  7. 【Android】15.0 第15章 广播和通知—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-28 一.简介 广播(Broadcast):其功能类似于收音机的广播,你只要调到那个台(只要在接收的类中注册了要接收的广播),就能 ...

  8. Linux 进程资源用量监控和按用户设置进程限制

    每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...

  9. Ecshop安装的坑,建议不要使用!

    最近因为工作的需要,安装了下ecshop,这个曾经的火爆开源程序,现在也呈现出疲态. 1.请看官方的运行环境推荐: 服务器端运行环境推荐·php版本5.0以上5.3以下的版本(推荐使用5.2系列版本) ...

  10. cocos2dx对所有子节点设置透明度

    看到cocos2dx2.2.5发布了,修复了输入框的bug,于是我们的项目也升级到了2.2.5, 升级过程还是比较顺利,没想到后来发现设置透明度无效了. 经过调试发现要调用一下setCascadeOp ...