希尔排序(Shell's Sort)是插入排序的一种,又称"缩小增量排序",是直接插入排序算法经过改进之后的一种更高效的版本。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

希尔排序基本思想

先将整个待排元素序列切割成若干个子序列分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于直接插入排序在元素基本有序的情况下(接近最好情况),排序效率是非常高的,因此希尔排序在时间效率上有较大的优势。

算法分析

希尔排序中对于增量序列的选择十分重要,直接影响到希尔排序的性能。希尔排序算法的性能,目前最重要的结论是它的运行时间达不到平方级别。比如选择的增量序列{n/2,(n/2)/2...1}(希尔增量),其最坏时间复杂度依然为O(n2)。在实际应用中,使用经过优化算法中的递增序列,经过复杂证明可使得最坏时间复杂度为O(n3/2)。

算法步骤

1、选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1。

2、按增量序列个数 k,对序列进行 k 趟排序。

3、每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

代码实现

input: an array a of length n with array elements numbered 0 to n − 1

  inc ← round(n/2)

  while inc > 0 do:

  for i = inc .. n − 1 do:

   temp ← a[i]

   j ← i

  while j ≥ inc and a[j − inc] > temp do:

   a[j] ← a[j − inc]

   j ← j − inc

   a[j] ← temp

inc ← round(inc / 2.2)

算法优缺点

希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度与增量序列的选取有关,所以希尔排序在中等大小规模表现良好,对规模非常大的数据排序不是最优选择。

希尔排序非常容易实现,算法代码短而简单。在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。只对特定的待排序记录序列,可以准确地估算关键词的比较次数和对象移动次数。本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度效率有更大的提高。

最后

希尔排序能够解决一些初级排序算法无能为力的问题,因为对于中等大小的数组它的运行时间是可以接受的。它的代码量很小,且不需要使用额外的内存空间。如果需要解决一个排序问题而又没有系统排序函数可用,可以先用希尔排序,然后再考虑是否值得将它替换为更加复杂的排序算法。

希尔排序 最坏时间_希尔排序算法相关推荐

  1. 希尔排序 最坏时间_排序算法(2)

    本文介绍插入排序和希尔排序,插入排序是较为常见的排序算法,希尔排序也是基础的排序算法,废话不多说,具体来看一下两种算法. 山 插入排序 插入排序的基本思想是拿到下一个插入元素,在已经有序的待排数组部分 ...

  2. 希尔排序 最坏时间_算法篇----希尔排序

    在之前的文章里,我们讲解了插入排序,而希尔排序相当于对插入排序的一种优化.在这里我们简单回顾下插入排序,插入排序的核心思想是,从数组首位开始,通过遍历,将相邻的两个元素进行排列,小的元素放在前面,大的 ...

  3. js排序的时间复杂度_经典排序方法的python实现和复杂度分析

    1.冒泡排序: 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数 ...

  4. java内置排序有哪些_内部排序比较(Java版)

    内部排序比较(Java版) 2017-06-21 目录 1 三种基本排序算法 1.1 插入排序 public static void InsertSort(int[] arrs) {intj;intt ...

  5. 算法导论-9.3-3-快速排序-最坏时间O(nlgn)

    一.题目 假定元素的值不同,说明如何才能使快速排序在最坏情况下以O(nlgn)时间运行 二.思考 要改善最坏情况的下运行时间,就要从划分入手,保证即使是最坏情况,也要尽量均衡地划分. 因此,使用SEL ...

  6. 希尔排序java代码_希尔排序及希尔排序java代码

    由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序按照此规律直到全部参与了排序.然后将间隔约定为4-1=3,然后 ...

  7. 链表排序c++代码_[链表面试算法](一) 链表的删除-相关题型总结(6题)

    在数据结构的最高层抽象里,只有两种结构,数组和链表.这两种结构,是所有其他数据结构实现的基础.队列和栈,可以用链表和数组来实现.图,可以用邻接表和邻接矩阵来实现,其中,邻接表就是链表,邻接矩阵就是数组 ...

  8. [转载] python选择排序二元选择_选择排序:简单选择排序(Simple Selection Sort)

    参考链接: Python中选择排序Selection Sort 基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的 ...

  9. 字典排序什么意思_字典序排序

    查字典时,比如查单词 Love ,我们是从第一个字母L,开始查找,在A~Z开头中的单词中,不管是实际操作的二分查找还是别的方式查找,总能找到L打头的单词所在的位置范围,然后又在这个范围内开始查找O字母 ...

最新文章

  1. URAL 1203 Scientific Conference(贪心 || DP)
  2. Jquery_改变背景颜色
  3. 学习VIM编辑器的使用
  4. linu下未编译的mysql安装包
  5. 喜讯丨神策数据四大客户案例斩获大数据“星河”案例
  6. activemq网络桥接_ActiveMQ –经纪人网络解释–第3部分
  7. groovy 对 list 排序
  8. Visual Studio 窗口的图标、图片资源 $this.Icon 在哪查看
  9. 高通侧目!联发科发布面向高端手机的5G芯片
  10. AWT_addKeyListener键盘监听事件(Java)
  11. c语言引用与指针有什么区别,Java引用与C语言指针的区别
  12. Nginx的安装、启动、停止命令
  13. eplan连接定义点不显示_EPLAN电气图实例-控制回路(电机回路6)
  14. 360视频:二十面体投影ISP
  15. VS(visual studio)中使用ReportViewer控件和报表设计器 RDLC
  16. Sam Altman 山姆奥特曼:关于生产率(工作效率)
  17. 用原生JS和CSS3做一个有趣的cube相册
  18. Java使用get请求接收List集合数据(json)并导出报表
  19. vasp服务器中断,求助VASP能带计算的中断原因 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  20. “微信之父”张小龙年薪3亿,曾独自一人完成7万行代码

热门文章

  1. 基于卷积神经网络的主观题阅卷系统的设计与实现
  2. 量具管理-分发与报废
  3. java修改窗口形状_java – 使用透明图像的AWT自定义窗口形状
  4. iOS 6.1完美越狱教程
  5. 设备管理系统的功能通常有哪些?
  6. opencv 不能播放avi视频
  7. mycat分库分表+springcloud微服务小案例实现
  8. Python绘图之Matplotlib
  9. Oracle的TNS协议解析
  10. Unity 数字跳动增长,金币收集路径动画