排序七部曲之(七)希尔排序
2016-05-18 17:44
253 查看
希尔排序的原理:本质上是插入排序。插入排序在某些情况下效率是很高的,比如需要排序的序列基本有序时,插入排序的效率可以接近O(N)。
那么问题在于,现实中的序列基本上都是不满足基本有序的,如何使一个序列在进行插入排序前是满足基本有序的呢?科学家希尔将插入排序进行了改进,提高了排序的效率。
希尔排序的实现:将待排序列分割成若干个子序列,但子序列的不是逐段分割的,每个子序列由相隔某个增量的元素组成,对各个子序列进行插入排序。然后将增量缩小,再次分割成一个个的子序列。。。,最后直到增量为1时,整个序列只有一个子序列,就是序列本身。
以序列12 17 30 50 20 60 65 4 19为例
第一次增量gap=N/2=4
序列分成4个子序列{12,20},{17,60},{30,65},{50,4},(分组没有改变元素原来的位置)分别进行插入排序后的序列为:
12 17 30 4 20 60 65 50 19
第二次增量为gap=gap/2=2
序列分成2个子序列{12,30,20,65},{17,4,60,50},排序后
12 4 20 17 30 50 65 60 19
第三次增量为gap=1
序列分成一个子序列{12,4 ,20 ,17 ,30, 50, 65 ,60, 19},排序后
4 12 17 19 20 30 50 60 65
那么问题在于,现实中的序列基本上都是不满足基本有序的,如何使一个序列在进行插入排序前是满足基本有序的呢?科学家希尔将插入排序进行了改进,提高了排序的效率。
希尔排序的实现:将待排序列分割成若干个子序列,但子序列的不是逐段分割的,每个子序列由相隔某个增量的元素组成,对各个子序列进行插入排序。然后将增量缩小,再次分割成一个个的子序列。。。,最后直到增量为1时,整个序列只有一个子序列,就是序列本身。
以序列12 17 30 50 20 60 65 4 19为例
第一次增量gap=N/2=4
序列分成4个子序列{12,20},{17,60},{30,65},{50,4},(分组没有改变元素原来的位置)分别进行插入排序后的序列为:
12 17 30 4 20 60 65 50 19
第二次增量为gap=gap/2=2
序列分成2个子序列{12,30,20,65},{17,4,60,50},排序后
12 4 20 17 30 50 65 60 19
第三次增量为gap=1
序列分成一个子序列{12,4 ,20 ,17 ,30, 50, 65 ,60, 19},排序后
4 12 17 19 20 30 50 60 65
//希尔排序,对长度为n的数组a排序 static void shellSort() { for(int gap=n/2;gap>0;gap/=2) { for(int i=0;i<gap;i++) {//将原序列分成了gap组每组为:(i,gap+i,2*gap+i,...) for(int j=i+gap;j<n;j+=gap) { int k=j; int target=a[j]; while(k>=gap && target<a[k-gap]) { a[k]=a[k-gap]; k=k-gap; } a[k]=target; } } } }
相关文章推荐
- canvas
- 微博关注我、我关注你数据库该怎么设计
- 关于APP自动化工程的一点小想法
- mysql的日期类型date, datetime, timestamp
- Weak Event模型
- 关于APP自动化工程的一点小想法
- POJ 3580-SuperMemo-splay树
- CentOS 7 下设置DNS
- nginx配置location总结及rewrite规则写法
- 九度-1198:a+b(大数相加)
- Linux下配置Python开发环境vim
- select网络模型知识总结
- C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享
- wg/wrk: Modern HTTP benchmarking tool
- object-oriented second work
- HDU 3487-Play with Chain-splay
- LCD正向扫描和反向扫描
- 让数码管比段生成器去见鬼吧
- Android亮屏和熄屏控制
- select...for update使用方法