排序算法——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 发布文章使用:只允许注册用户才可以访问!
随机推荐
- 【THUSC2017】座位
题目背景 班级聚会的时候,班主任为了方便管理,规定吃饭的时候同一个寝室的同学必须坐在一起;但是吃完饭后,到了娱乐时间,喜欢不同游戏的同学会聚到一起;在这个过程中就涉及到了座位分配的问题. 题目描述 有 ...
- 适用于vue项目的打印插件
此方法只适用于现代浏览器,IE10以下就别用了 // 使用时请尽量在nickTick中调用此方法 //打印 export default (refs, cb) => { let cloneN i ...
- PCA主成分分析 R语言
1. PCA优缺点 利用PCA达到降维目的,避免高维灾难. PCA把所有样本当作一个整体处理,忽略了类别属性,所以其丢掉的某些属性可能正好包含了重要的分类信息 2. PCA原理 条件1:给定一个m*n ...
- enumerate 遍历numpy数组
enumerate 遍历numpy数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 遍历一维数组 i,j 分别表示数组的 索引 和 存储的值 import numpy as np a=np ...
- 科学计算三维可视化---Mayavi入门(Mayavi库的基本元素和绘图实例)
一:Mayavi库的基本元素 .处理图形可视化和图形操作的mlab模块 .操作管线对象,窗口对象的api (一)mlab模块 (二)mayavi的api 二:快速绘图实例 (一)mlab.mesh的使 ...
- linux之top命令详解
top:动态查看进程变化,监控linux的系统状况. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 下面详细介绍它的使用方法 ...
- Qt_扫雷游戏实现
源代码下载(详细注释): 详细代码(注释): https://github.com/xiaocangtian/GameMine 链接: http://pan.baidu.com/s/1gf9Ux5h ...
- sql 2012之后分页查询速度问题
一.SQL Server 2012使用OFFSET/FETCH NEXT分页,比SQL Server 2005/2008中的RowNumber()有显著改进.今天特地作了简单测试,现将过程分享如下: ...
- Java并发编程原理与实战二十六:闭锁 CountDownLatch
关于闭锁 CountDownLatch 之前在网上看到过一篇举例非常形象的例子,但不记得是出自哪里了,所以这里就当自己再重新写一篇吧: 例子如下: 我们每天起早贪黑的上班,父母每天也要上班,有一天定了 ...
- Redis实战(二)CentOS 7上Redis两种方式持久化
Redis的持久化之RDB RDB方式是通过快照完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并且存储到硬盘上. 进行快照的条件在配置文件中指定,有2个参数构成:时间和改动的键的个 ...