前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序本节,我们介绍插入排序的改进版的希尔排序。

希尔排序是1959年,Shell发明的,这是第一个突破O(n2)的排序算法,他与直接插入排序不同的是,他会优先比较距离较近的元素。因此,希尔排序又叫做缩小增量排序

1、算法思想

其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成。

希尔排序的实质就是分组的插入排序

2、优缺点

优点
空间复杂度较好,O(1);作为改进版的插入排序,是一种相对高效的基于交换元素的排序方法。
缺点
(i) 不稳定,在交换的过程中,会改变元素的相对次序。
(ii) 希尔排序的时间复杂度依赖于增量序列函数,所以分析起来比较困难,当n在某个特定范围的时候,希尔排序的时间复杂都约为O(n1.3)

3、关键点

确定增量划分序列组,在不同的组中进行直接插入排序。实际上每次都是在间隔为gap的距离中进行比较(根据下图来理解)

4、图例演示过程

最原始的那种增量,即从 gap=length/2 逐步减半,其实这还不算最快的希尔,有几个增量在实践中表现更出色,希尔排序是实现简单但是分析极其困难的一个算法的例子。
说了这么多理论性的文字,可能不太好理解,所以用图示来帮助大家更好的理解希尔排序直接插入排序的关系。

给定一个数组 [55,2,6,4,32,12,9,73,26,37] 对其进行希尔排序的操作过程如下图所示:

5、程序代码c++

/****************************************************************************  @file       Shell_sort.cpp*  @author     Shawn*  @date       7  Jan 2019*  @remark     7  Jan 2019*  @theme      Shell Sort***************************************************************************/
# include<iostream>
using namespace std;
void shellsort(int[], int);int main()
{int array [] = {55,2,6,4,32,12,9,73,26,37};int len = sizeof(array) / sizeof(int);cout<<"输入的原始序列:  ";for(int i=0; i<len; i++) // 输出原序列cout<<array[i]<<",";cout<<endl<<endl;cout<<"  ----希尔排序开始---- " << endl;shellsort(array,len); // 调用排序函数return 0;
}void shellsort(int a[], int size)
{int i, j, gap;for (gap = size / 2; gap > 0; gap /= 2) // 每次的增量,递减趋势{for (i = gap; i < size; i++) //每次增量下,进行几组插入排序,如第一步就是(从12,9,73,26,37)5次for (j = i ; j -gap >= 0 && a[j-gap] > a[j]; j -= gap)// 每个元素组中进行直接插入排序,看例子swap(a[j-gap], a[j]); //如果增量为2时他的插入查询操作下标为://(2-0,3-1/ 4-2-0,5-3-1/ 6-4-2-0,7-5-3-1/ 8-6-4-2-0,9-7-5-3-1)for(int k=0; k<size; k++) // 输出每轮排序结果cout<<a[k]<<",";cout<<endl;}
}

后记思考:

为什么希尔能突破O(n2)的界,可以用逆序数来理解,假设我们要从小到大排序,一个数组中取两个元素如果前面比后面大,则为一个逆序,容易看出排序的本质就是消除逆序数,可以证明对于随机数组,逆序数是O(n2)的,而如果采用“交换相邻元素”的办法来消除逆序,每次正好只消除一个因此必须执行O(n2)的交换次数,这就是为什么冒泡、插入等算法只能到平方级别的原因,反过来,基于交换元素的排序要想突破这个下界,必须执行一些比较,交换相隔比较远的元素,使得一次交换能消除多个逆序,希尔、快排、堆排等等算法都是交换比较远的元素,只不过规则各不同罢了。 本段部分内容参考知乎冒泡的回答: https://www.zhihu.com/question/24637339/answer/84079774

下一讲:堆排序

排序算法研究之希尔排序(shell sort)相关推荐

  1. js排序算法详解-希尔排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...

  2. 排序算法研究之归并排序(Merge sort)

    前面几个小节,我们分别介绍了冒泡排序,插入排序,直接快速排序 ,选择排序 , 希尔排序, 堆排序本节,我们介绍基于归并操作的归并排序. 1.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该 ...

  3. 希尔排序是一种稳定的排序算法_全面解析十大排序算法之四:希尔排序

    点击上方蓝字关注我们吧 1. 十种排序算法的复杂度和稳定性 时间复杂度:一个算法消耗所需要的时间 空间复杂度:运行一个算法所需要的内存时间 稳定性:如一个排列数组:1.4.5.6.4.7. 此时有一对 ...

  4. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  5. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  6. 算法系列【希尔排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入 ...

  7. python算法与数据结构-希尔排序算法(35)

    阅读目录 一.希尔排序的介绍 二.希尔排序的原理 三.希尔排序的图解 四.希尔排序的python代码实现 五.希尔排序的C语言实现 六.希尔排序的时间复杂度 七.希尔排序的稳定性 一.希尔排序的介绍 ...

  8. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  9. 希尔排序 最坏时间_希尔排序算法

    希尔排序(Shell's Sort)是插入排序的一种,又称"缩小增量排序",是直接插入排序算法经过改进之后的一种更高效的版本.希尔排序为了加快速度简单地改进了插入排序,交换不相邻的 ...

最新文章

  1. matlab编程实现基于密度的聚类(DBSCAN)
  2. SQL Server 2008 R2中文版快速安装
  3. php自定义弹窗,自定义弹窗Style样式
  4. php tp框架做选中删除,关于thinkphp框架实现删除和批量删除的分析
  5. linux redis可视化工具,几款开源的图形化Redis客户端管理软件
  6. 如何学好前端,这5点你一定要知道!
  7. 数据分析师的30种死法
  8. ecmall商品列表页排序的完美解决方案
  9. XDroid 轻量级的Android快速开发框架
  10. 2017年深度学习语义分割导读
  11. 2020最新版前端学习路线图--Javascript网页编程重点知识
  12. FIFA Women's World Cup France 2019™ -国际足协继海奶奶女子世足杯曲终人散,USA碰杯
  13. 微信小程序之callout自定义气泡
  14. pinyin4j使用说明
  15. 服务器虚拟化及云计算基础实验
  16. 戴尔服务器710u盘安装系统,联想G710笔记本U盘重装Win7系统教程
  17. srs可以用java开发吗,为SRS流媒体服务器添加HLS加密功能(附源码)
  18. 腾讯云域名与个人树莓派设备的动态域名解析
  19. 【效能平台】接口模块——获取列表数据、查看详情数据、增加以及更新项目接口、删除接口相关功能开发(六)
  20. 【毕业设计】大数据疫情可视化分析系统 - python

热门文章

  1. 产品设计-9.制作产品流程图
  2. 技术管理如何管理,如何构建领导力、构建团队文化
  3. 【AHK】微信自定义快捷键/微信体验优化/微信常用快捷键
  4. 百度智能云数据众包,更安全、更优质的数据能力,打造自动驾驶超智“双眼”...
  5. lazarus在macos里调用外部浏览器打开一个网址
  6. 网络_04 访问控制
  7. 设计必备----色彩标准卡
  8. alias和redirect的区别
  9. 通过数据分析提升客流量和销售额
  10. 二级计算机中应用的公式,计算机二级公式总结(计算机二级excel主要函数的用法)...