希尔排序(Shell Sort):是插入排序算法的一种更高效的改进版本。在这之前冒泡、选择、插入排序的时间复杂度基本都是O(n²)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。

官方解释如下:

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序在插入排序的基础上增加一个叫增量的概念。那什么增量?插入排序只能与相邻的元素进行比较,而希尔排序则是进行跳跃比较,而增量就是步长。比如增量为3时,下标为0的元素与下标为3的元素比较,3再与6比较,1与4比较,4再与7比较……比较完后,再去减少增量,重复之前步骤,直到增量为1,此时只有一个分组了,再对这一个分组进行插入排序,整个希尔排序就结束了。

代码如下:

//起始间隔值gap设置为总数的一半,直到gap==1结束
-(void)shellSort:(NSMutableArray *)list{int gap = (int)list.count / 2;while (gap >= 1) {for(int i = gap ; i < [list count]; i++){NSInteger temp = [[list objectAtIndex:i] intValue];int j = i;while (j >= gap && temp < [[list objectAtIndex:(j - gap)] intValue]) {[list replaceObjectAtIndex:j withObject:[list objectAtIndex:j-gap]];j -= gap;}[list replaceObjectAtIndex:j withObject:[NSNumber numberWithInteger:temp]];}gap = gap / 2;}
}

// 传入@[@8,@7,@6,@5,@4,@3,@2,@1],表变化如下:
8 7 6 5 8 3 2 1
4 7 6 5 8 3 2 1
4 7 6 5 8 7 2 1
4 3 6 5 8 7 2 1
4 3 6 5 8 7 6 1
4 3 2 5 8 7 6 1
4 3 2 5 8 7 6 5
4 3 2 1 8 7 6 5
4 3 4 1 8 7 6 5
2 3 4 1 8 7 6 5
2 3 4 3 8 7 6 5
2 1 4 3 8 7 6 5
2 1 4 3 6 7 8 5
2 1 4 3 6 7 8 7
2 1 4 3 6 5 8 7
2 2 4 3 6 5 8 7
1 2 4 3 6 5 8 7
1 2 4 4 6 5 8 7
1 2 3 4 6 5 8 7
1 2 3 4 6 6 8 7
1 2 3 4 5 6 8 7
1 2 3 4 5 6 8 8
1 2 3 4 5 6 7 8

希尔排序示例图如下:

对上图解释如下:

  1. 起始增量值设置为总数的2/3。
  2. 从增量位置开始,依次与差一个增量的前一个值比较。例:第一个与表总数的2/3的元素比,小的移动到前面。 比较完后起始位置+1继续比较。
  3. 比较到最后,增量减半,并以此为起始点, 重复第二步,直到间隔数为1为止结束。
增量的计算

因为增量的选择是希尔排序的重要部分, 所以摘出来单独说明。 作者最初的建议是折半再折半直到最后的增量为1, 但是当用较小增量排序后,以前用的较大增量仍然是有序的。 如果一个数列以增量5进行了排序然后再以增量3进行排序,那么该数列不仅是以增量3有序,而且是以增量5有序。如果不是这样,那么算法在迭代过程中会打乱以前的顺序,那就不会以如此短的时间完成排序了。

已知的最好增量序列是由Sedgewick提出的 1,5,19,41,109,...

它是由交错两个序列的元素获得:<公式: 9(4 ķ - 2 ķ)+ 1 和 2 K + 2(2 K + 2 - 3)+ 1 >
1,19,109,505,2161,... ...,|| 9(4 ķ - 2 ķ)+ 1,K = 0,1,2,3,... 5,41,209,929,3905,... ..|| 2 K + 2(2 K + 2 - 3)+ 1,K = 0,1,2,3,...

用这样增量序列的希尔排序比插入排序要快,甚至在小数组中比快速排序堆排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。

希尔排序复杂度分析:

在最坏的情况下时间复杂度仍为O(n²),而使用最优的增量在最坏的情况下却为O(n²⁄³)。需要注意的是,增量序列的最后一个增量值必须等于1才行。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。


作者:方圆一里链接:http://www.jianshu.com/p/c74dd2954b8e來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

iOS算法总结-希尔排序相关推荐

  1. python希尔排序的优缺点_Python排序搜索基本算法之希尔排序实例分析

    本文实例讲述了Python排序搜索基本算法之希尔排序.分享给大家供大家参考,具体如下: 希尔排序是插入排序的扩展,通过允许非相邻的元素进行交换来提高执行效率.希尔排序最关键的是选择步长,本程序选用Kn ...

  2. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  3. Java排序算法之——希尔排序

    算法简述 希尔排序也叫作shell排序或缩小增量排序,据说是一个叫D.L.Shell的人发明出来的,顾取名shell排序.这种排序是基于插入排序思想的,也比较适用于数据量大时. 我刚开始看到时候对于插 ...

  4. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  5. 数据结构与算法之希尔排序

    数据结构与算法之希尔排序 目录 希尔排序介绍 希尔排序法的示意图 代码实现 1. 希尔排序介绍 简单插入排序存在的问题:当然需要插入的数是较小的数时,后移的次数明显增加,对效率有影响. 希尔排序法介绍 ...

  6. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  7. [算法]-排序算法之希尔排序

    希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...

  8. 排序算法:希尔排序算法实现及分析

    希尔排序算法介绍 希尔排序是D.LShell 与1957年提出来的一种排序算法,在这之前排序算法的时间复杂度都是O(n^2),希尔排序算法是突破这个时间复杂度的第一批算法之一.我们知道直接插入排序算法 ...

  9. C/C++排序算法(2)希尔排序

    常见排序算法总结(2)希尔排序 一篇文章,带你搞懂 希尔排序 (注:代码语言的选择不应该限制了我们对算法的理解) 文章附有动图!一看就懂! (1)工作原理 希尔排序,也称递减增量排序算法,是插入排序的 ...

最新文章

  1. JavaScript(转载)
  2. 德国SNS交友/视频网站Poppen.de的技术架构分享
  3. Ext.ux.form.SearchField使用方法
  4. JSON的使用・小结
  5. 【技术综述】人脸风格化核心技术与数据集总结
  6. 关于matlab中princomp的使用说明讲解
  7. 独家干货 | 吴恩达深度学习专项课程精炼笔记!
  8. 漫游Kafka实战篇之客户端编程实例
  9. (10)Node.js核心模块—fs文件系统之目录操作
  10. un3.0服务器文档,unturned3.0服务器指令是什么?
  11. [Oracle] 日期处理
  12. jQuery/javascript实现全选全不选
  13. java List转换为字符串并加入分隔符的一些方法总结
  14. inPixio Photo Studio 11(图片编辑软件)官方正式版V11.0.7709.20526 | 超好用的图片编辑器
  15. MATLAB中调用eemd函数
  16. Pandas数据分析教程(2)-数据读取之普通索引、loc/iloc索引
  17. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学专业
  18. 周金涛:繁荣的起点并非沸腾的年代,或将在2020年出现首次证券市场大繁荣
  19. 情感识别相关数据集总结
  20. 27岁程序员转职赏金猎人:一个漏洞10万美元,比工资香多了

热门文章

  1. NFC支付中token的应用
  2. Java 17的这些新特性不看后悔
  3. windows上传ipa到开发者中心,上架app到苹果应用市场
  4. 火车车厢座位分布指南
  5. BugKu color
  6. 土豪依然很霸气 苹果iPhone 5S热卖
  7. 如何最大化利用100字符ASO优化,aso关键词多少字符
  8. TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)
  9. 【北交所周报】近九成个股下跌,凯大催化上市当天涨39%;北交所发行节奏放缓,上周仅瑞星股份一家企业过会;...
  10. 记: 对于SCPI指令以及相同类型指令解析器的指令压缩方式