[4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
题目
插入排序法由未排序的后半部前端取出一个值。插入已排序前半部的适当位置。概念简单但速度不快。
排序要加快的基本原则之中的一个:
是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,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间隔的更多相关文章
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- 数据结构与算法之--高级排序:shell排序和快速排序
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
2013-08-22 14:55:33 八大排序方法汇总(选择排序-简单选择排序.堆排序,插入排序-简单插入排序.shell排序,交换排序-冒泡排序.快速排序,归并排序,计数排序). 插入排序还可以和 ...
- 算法:希尔排序(Shell Sort)
背景 在三种简单的排序算法中(冒泡.选择和插入)插入排序的算法最好,不过插入过程可能需要进行大量的移动,如何尽可能少的移动元素呢?希尔排序正是基于对这个问题的思考而想出来的,考虑到希尔排序对已排序数组 ...
- Java常见排序算法之折半插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- Java常见排序算法之直接插入排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 《算法导论》插入排序----InsertSort
算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...
- JavaScript ,Python,java,C#,Go系列算法之【插入排序篇】
常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法. ...
- 【DS】排序算法之希尔排序(Shell Sort)
一.算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的:1)插入排序在对几乎已经排好序的数据操作 ...
随机推荐
- 转:Socket常用选项
功能描述 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值指 ...
- github get 请求指定页面的代码
https://raw.githubusercontent.com/dragon8github/wx-h5/master/push.sh
- [elk]elasticsearch dashboard+保留10天内索引+导入导出备份
es dashboard 有两款 head 这款我一直在用 https://github.com/mobz/elasticsearch-head 先修改es的配置文件: elasticsearch.y ...
- DB2检测表字段改动的方法(不用触发器)
ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...
- 【C/C++语言】int 在计算机内部的存储
int在32位计算机中占4个字节,主要是想弄清楚这4个字节的在内存中存放的顺序. #include <iostream> using namespace std; typedef stru ...
- Qt5中的QtGui
我在学习Qt查看Qt Creater提供的例子时,遇到了一个小问题.就是明明在代码中包含了QtGui,然而编译的时候还是提示找不到QLabel的定义,以及其他一些类的定义,但是这是官方提供的文档的啊, ...
- SQL Server 2014 Agent 无法启动
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">- <System& ...
- java 代理模式,观察者模式
代理模式1 import <a href="http://lib.csdn.net/base/17" class='replace_word' title="Jav ...
- Unity3D学习(九):C#和C++的相互调用
前言 不知不觉已经一年了,这一年来一直忙于公司项目疯狂加班,很少有自己的时间写下东西.不过好在项目最近也步入正轨了,正好抽空写点东西记录下学到的一些东西. 公司项目是一个端游IP移植手游,端游是基于C ...
- [爬虫]Python爬虫基础
一.什么是爬虫,爬虫能做什么 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.比如它在抓取一个网 ...