排序算法——Shell排序
二、Shell排序
Shell排序也叫“缩减增量排序”(disminishing increment sort),基于插入排序进行。
Shell建议的序列是一种常用但不理想的增量序列:1,...,N/8,N/4,N/2 (ht=N/2,hk=hk+1/2)
void shellSort(vector<int> &a)
{
for(int gap=a.size()/;gap>;gap/=)
{
//对于hk(即gap),hk+1,...,N-1中的每个位置i,把位置i上的元素放到i,i-hk,i-2hk......中的正确位置上
for(int i=gap;i<a.size();++i)
{
int tmp=a[i];
int j=i;
for(;j>=gap&&tmp<a[j-gap];j-=gap)
{
a[j]=a[j-gap];
}
a[j]=tmp;
}
}
思路:
通过比较相隔一定间隔(hk)的元素来工作,各趟比较所用的距离随算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
步骤:
使用一个增量序列h1,h2,...ht,只要h1=1,任何增量序列都是可行的。
1)先将待排元素序列分成若干个子序列(每个子序列由相隔某个“增量”的元素组成),分别进行插入排序;
在使用增量hk的一趟排序后,对每个i,都有a[i]≤a[i+hk],即所有相隔hk的元素都被排序,此时称文件是hk排序的;
一趟hk排序的作用,即对hk个独立子数组执行一次插入排序。
(希尔排序的一个重要性质——一个hk排序的文件保持它的hk排序性,不会被后面的各趟排序打破。)
2)依次缩减增量,再重复步骤 1)进行排序;
3)直到hk为1时,再对全体元素进行一次直接插入排序(insertion sort);

待排数组为{34,8,64,51,32,21,5},数组大小N=7,则增量序列为1,3。
hk=3时,对{34,51,5},{8,32},{64,21}这3个子数组进行插入排序(其中,每个数组元素相隔3),hk=3 排序后的数组为{5,8,21,34,32,64,51}。
增量缩减为hk=1,即对全体元素进行一次插入排序,排序完成,得到最终的有序数组为 {5,8,21,32,34,51,64}。
时间复杂度:
Shell排序的运行时间依赖于增量序列的选择,证明较为复杂。
使用Shell建议的增量序列:1,...,N/8,N/4,N/2 (ht=N/2,hk=hk+1/2),最坏情形是Θ(N2)
使用Hibbard增量序列:1,3,7,......,2k-1,最坏情形为Θ(N3/2).
适用情形:
普通的插入排序适用于非常少量的输入。
希尔排序在适量输入时是上佳选择,对适当的增量序列,性能极好,且代码少,易写。
排序算法——Shell排序的更多相关文章
- 基本排序算法——shell排序java实现
shell排序是对插入排序的一种改进. package basic.sort; import java.util.Arrays; import java.util.Random; public cla ...
- java排序算法(八):希尔排序(shell排序)
java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...
- 排序算法--希尔排序(Shell Sort)_C#程序实现
排序算法--希尔排序(Shell Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难 ...
- 数据结构和算法(Golang实现)(22)排序算法-希尔排序
希尔排序 1959 年一个叫Donald L. Shell (March 1, 1924 – November 2, 2015)的美国人在Communications of the ACM 国际计算机 ...
- 经典排序算法 - 高速排序Quick sort
经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...
- 排序算法--选择排序(Selection Sort)_C#程序实现
排序算法--选择排序(Selection Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 数据结构和算法(Golang实现)(20)排序算法-选择排序
选择排序 选择排序,一般我们指的是简单选择排序,也可以叫直接选择排序,它不像冒泡排序一样相邻地交换元素,而是通过选择最小的元素,每轮迭代只需交换一次.虽然交换次数比冒泡少很多,但效率和冒泡排序一样的糟 ...
- 使用 js 实现十大排序算法: 桶排序
使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
- 使用 js 实现十大排序算法: 计数排序
使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
随机推荐
- module.exports 、 exports 和 export 、 export default 、 import
1:commonjs规范 module.exports={a:10,b:20} var test=require('lib/test') console.log(test.a);console.log ...
- 【BZOJ3551】Peaks加强版(Kruskal重构树,主席树)
[BZOJ3551]Peaks加强版(Kruskal重构树,主席树) 题面 BZOJ Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相 ...
- wget递归下载整站
由于线上跑的系统还有CentOS5.4.6.4.6.5.6.5.6.6.6.8,而各镜像站维护的最早的版本已经是6.9,所以需要爬archive站点的rpm包来自建yum仓库. # wget -r - ...
- PHP获取IP地址的方法,防止伪造IP地址注入攻击
PHP获取IP地址的方法 /** * 获取客户端IP地址 * <br />来源:ThinkPHP * <br />"X-FORWARDED-FOR" 是代理 ...
- bzoj 4568: [Scoi2016]幸运数字
4568: [Scoi2016]幸运数字 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 848 Solved: 336[Submit][Status ...
- echarts彩虹柱状图 每个bar显示不同颜色, 标题在不同位置 ,工具中有可以直接保存为图片下载,平均线的添加
可以参考: https://echarts.baidu.com/echarts2/doc/example.html https://echarts.baidu.com/echarts2/doc/doc ...
- libcurl代码示例
http://note.youdao.com/noteshare?id=e60a679d1731c870ff45e403de81a2c0
- 题解【bzoj2002 [Hnoi2010]Bounce 弹飞绵羊】
Description 给 \(n\) 个点以及它们的弹力系数 \(k_i\) ,含义为 可以弹到 \(i + k_i\) 的位置. 支持两个东西,修改一个点的弹力系数:求一个点要弹多少次弹出 \(n ...
- Laravel 限流中间件 throttle 简析
1. 在Laravel 中配置 在 app\Http\Kernel.php 中,默认添加到中间件组 api 下,1分钟60次. 2. 限流原理 获取唯一请求来源,进行唯一标识(key) 获取该请求请求 ...
- GeoDa计算全局Moran‘I
GeoDa计算全局Moran‘I 1.导入包含数据的.shp文件 2.创建权重矩阵,点击Weight Manger,再点击Create, weights file ID variable(其中包含的数 ...