希尔排序(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. SaltStack自动化运维(一)——简介与架构解析
  2. 46 岁美国华裔“鞋王”意外去世,25 岁创业成亿万富翁
  3. leetcode算法题解(Java版)-9-N皇后问题
  4. requests与urllib.request
  5. android qq 进程保活,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...
  6. Nacos命名空间管理
  7. 女方父母总是插手家里的事怎么办?
  8. 表单中的日期 字符串和Javabean中的日期类型的属性自动转换
  9. 莫代尔是什么?它有哪些优缺点?
  10. backgroundworker 在执行dowork事件时该如何取消_澳航官宣!明年上半年起,机场所有售票处和服务台永久取消,订票改签等只能“自助”...
  11. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
  12. 数据结构入门(二)固定容量数组
  13. docker ssh连接
  14. ttl接地是高电平还是低电平_数电练习题
  15. Python爬虫进阶七之设置ADSL拨号服务器代理
  16. 如何安装SQL server2005的查询分析器(绝对原创)
  17. 自己动手用麦咖啡(mcafee)打造自己的安全网站!安全系统(服务器)!
  18. php函数中pdf文件文字转曲,indesign使文字转曲的三种方法
  19. Arch-004ArchLinux搜狗输入法安装
  20. 关于打印机共享和连接问题

热门文章

  1. python全栈生鲜电商_Python前后端分离开发Vue+Django REST framework全栈打造生鲜电商项目...
  2. 利用huggingface模型翻译英文
  3. 发现了 ANTIARP这个软件的 一个严重的 BUG
  4. matlab quadprog_合成控制法及Matlab操作与应用
  5. python如何创建txt_python创建txt文件
  6. MATLAB人脸识别系统设计与仿真【GUI解界面】
  7. mysql身份证校验码_sql 语句 验证身份证号码
  8. Windows程序设计-子窗口控件
  9. c++ 非空指针 写入访问权限冲突_初识C语言指针
  10. 精准助力中小微企业 京东惠寻的核心逻辑是什么