[4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
来源:互联网 发布:远程端口是什么 编辑:程序博客网 时间:2024/06/06 18:55
题目
插入排序法由未排序的后半部前端取出一个值,插入已排序前半部的适当位置,概念简单但速度不快。
排序要加快的基本原则之一:
是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度,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;}
// 插入排序 使用指定间隔的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;}
- [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
- 算法实现之直接插入排序与shell排序
- 参数之回收间隔
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- shell命令sort以tab间隔排序
- 【排序算法之】Shell排序和插入排序
- 算法之插入排序与选择排序
- 间隔
- 插入排序之----shell排序
- 插入排序之shell排序
- 内部排序系列 之 插入排序与shell(希尔)排序
- 算法之路--插入排序
- 简单算法之插入排序及其优化shell排序
- 57.插入间隔
- 数据结构与算法之二分法插入排序
- 数据结构与算法之插入排序
- 算法学习与实践之插入排序
- eclipse搭建php-XDebug调试环境
- C++,rand,srand随机数
- 图 - 生成树和最小生成树 - 最小生成树
- LightOj 1020 博弈
- 如何学好C++语言
- [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
- How to install MySQL Server 5.6 on CentOS 7 / RHEL 7
- 《windows核心编程系列》谈谈windows线程栈
- C++程序设计之四书五经(上篇)
- unity3d ios平台优化图形性能
- Java移位操作符
- C++程序设计之四书五经(下篇)
- 发几个比较重要的链接
- HBase如何实现多条件查询