看图轻松理解数据结构与算法系列(希尔排序)

前言

推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql

希尔排序

希尔排序是希尔(Donald Shell)提出的一种排序方法,也属于插入排序,可是简单插入排序的高效版本,也称为缩小增量排序。基本思想是将待排序元素进行增量分组,而后在分组组内进行插入排序,随着增量的减小,每一个分组组内的元素愈来愈多,直至增量减至1时,全部元素都分到同一个组内,执行插入排序后完成整个排序操做。算法

排序要点

  1. 选取一个小于全部待排序元素数量n的整数i_1做为第一个增量,对所有元素进行分组,分组的依据是全部距离为i_1的倍数的记录分到同一组。
  2. 对分好的组,在组内进行直接插入排序。
  3. 接着取第二个增量i_2,其中i_2<i_1,而后根据新的增量继续分组并在组内进行直接插入排序。
  4. 重复第3步直到增量等于1,即全部记录都在同一分组中,再进行直接插入排序,完成排序。

希尔排序过程当中通常能够初次取全部元素数量的一半为增量,之后每次减半,直到增量为1。sql

排序过程

假设咱们有以下7个元素,分别为84, 25, 59, 71, 62, 16, 34,如今进行希尔排序。网络

image

第一轮选取全部元素数量的一半做为增量,即7/2,取3,因此第一轮增量为3,那么第一组分组就是索引为0,3,6对应的元素,即84,71,34,对其进行插入排序操做,数据结构

image

把84当作已排序序列,接着准备将组内第二个元素71插入到已排序序列中,并发

image

71小于84,因此84后移到71原来的位置,机器学习

image

接着将组内第三个元素34插入到已排序序列中,首先与84比较,数据结构和算法

image

34小于84,因此84后移,而后继续与71比较,学习

image

34小于71,因此71后移,34放进去。而后开始处理第二组分组,第二组分组就是索引为1,4对应的元素,即25,62,对其进行插入排序操做,.net

image

把25当作已排序序列,接着将组内第二个元素62插入到已排序序列中,

image

25小于62,因此不移动。而后开始处理第三组分组,第三组分组就是索引为2,5对应的元素,即59,16,对其进行插入排序操做,

image

把59当作已排序序列,接着将组内第二个元素16插入到已排序序列中,

image

16小于59,因此59后移而16前移。至此处理完增量为3的状况。

image

第二轮增量为上一轮增量的二分之一,即3/2,取1,因此第二轮增量为1,此时全部元素组成同一个分组,对该组进行插入排序操做,首先将34当成已排序序列,准备将25插入到已排序序列,

image

25小于34,因而34后移,

image

继续将下一个元素插入已排序序列中,16与34比较,

image

16小于34,因而34右移,接着16与25比较,

image

16小于25,25后移,16放进对应位置,

image

继续将下一个元素插入已排序序列中,71与34比较,

image

34小于71,不移动,71放回原来位置,

image

继续将下一个元素插入已排序序列中,62与71比较,

image

62小于71,因而71后移,接着62与34比较,

image

34小于62,不移动,62放到对应位置,

image

继续将下一个元素插入已排序序列中,59与71比较,

image

59小于71,因而71后移,而后继续与62比较,

image

59小于62,因而62也后移,而后继续与34比较,

image

34小于59,因而34不移动,59放到对应位置,

image

继续将下一个元素插入已排序序列中,已是最后一个元素了,84与71比较,

image

71小于84,因此不移动,此时已完成全部元素的希尔排序操做。

image

-------------推荐阅读------------

个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为何写《Tomcat内核设计剖析》

个人2017文章汇总——机器学习篇

个人2017文章汇总——Java及中间件

个人2017文章汇总——深度学习篇

个人2017文章汇总——JDK源码篇

个人2017文章汇总——天然语言处理篇

个人2017文章汇总——Java并发篇


跟我交流,向我提问:

欢迎关注:

相关文章
相关标签/搜索