推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
希尔排序是希尔(Donald Shell)提出的一种排序方法,也属于插入排序,可是简单插入排序的高效版本,也称为缩小增量排序。基本思想是将待排序元素进行增量分组,而后在分组组内进行插入排序,随着增量的减小,每一个分组组内的元素愈来愈多,直至增量减至1时,全部元素都分到同一个组内,执行插入排序后完成整个排序操做。算法
希尔排序过程当中通常能够初次取全部元素数量的一半为增量,之后每次减半,直到增量为1。sql
假设咱们有以下7个元素,分别为84, 25, 59, 71, 62, 16, 34
,如今进行希尔排序。网络
第一轮选取全部元素数量的一半做为增量,即7/2,取3,因此第一轮增量为3,那么第一组分组就是索引为0,3,6对应的元素,即84,71,34,对其进行插入排序操做,数据结构
把84当作已排序序列,接着准备将组内第二个元素71插入到已排序序列中,并发
71小于84,因此84后移到71原来的位置,机器学习
接着将组内第三个元素34插入到已排序序列中,首先与84比较,数据结构和算法
34小于84,因此84后移,而后继续与71比较,学习
34小于71,因此71后移,34放进去。而后开始处理第二组分组,第二组分组就是索引为1,4对应的元素,即25,62,对其进行插入排序操做,.net
把25当作已排序序列,接着将组内第二个元素62插入到已排序序列中,
25小于62,因此不移动。而后开始处理第三组分组,第三组分组就是索引为2,5对应的元素,即59,16,对其进行插入排序操做,
把59当作已排序序列,接着将组内第二个元素16插入到已排序序列中,
16小于59,因此59后移而16前移。至此处理完增量为3的状况。
第二轮增量为上一轮增量的二分之一,即3/2,取1,因此第二轮增量为1,此时全部元素组成同一个分组,对该组进行插入排序操做,首先将34当成已排序序列,准备将25插入到已排序序列,
25小于34,因而34后移,
继续将下一个元素插入已排序序列中,16与34比较,
16小于34,因而34右移,接着16与25比较,
16小于25,25后移,16放进对应位置,
继续将下一个元素插入已排序序列中,71与34比较,
34小于71,不移动,71放回原来位置,
继续将下一个元素插入已排序序列中,62与71比较,
62小于71,因而71后移,接着62与34比较,
34小于62,不移动,62放到对应位置,
继续将下一个元素插入已排序序列中,59与71比较,
59小于71,因而71后移,而后继续与62比较,
59小于62,因而62也后移,而后继续与34比较,
34小于59,因而34不移动,59放到对应位置,
继续将下一个元素插入已排序序列中,已是最后一个元素了,84与71比较,
71小于84,因此不移动,此时已完成全部元素的希尔排序操做。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: