第一步:分组
希尔排序算法先将要排序的数列分成若干子序列,而每个子序列中的元素并不是连续的。通俗的说,就是将数组划分为多个子数组,每个子数组看做一个列表,然后对子数组进行插入排序。
下面是希尔排序分组的动画演示。
https://blog-cdn-image.qiniu.bclouds.com/sort-heapsort-part-two.gif
可以看到,数组中间数隔了一个 h 的距离活着称为「增量」,对这多组数据分别进行插入排序。等第一轮排序结束后,再去处理下一轮分为的数据分组,依次执行该过程,直到h = 1 ,也就是最后一次执行插入排序。
第二步:插入排序
上述提到了,对于每个分组,都应该进行插入排序。插入排序是将一个记录插入到已经排好的有序表中,从而形成一个新的有序表。
下面是希尔排序插入排序的动画演示。
https://www.runoob.com/wp-content/uploads/2019/03/shellSort.gif
可以看到,先将最大或最小的元素交换位置。等基于当前增量的所有子序列中的数据排序完成后,增量变小再进行下一轮排序,重复上述操作。
第三步:回归原样
当分组的间距为 1 时,整个序列就成了有序序列,算法结束。这时排序过程中所有未排序部分都已经有序,只剩下增量为1时的序列未排序。
下面是希尔排序结合插入排序的动画演示。
https://www.runoob.com/wp-content/uploads/2019/03/shellSort.gif
在这个动画中,排序开始前,第一个数列按照偏移量 10 进行了插入排序。排序结束时,每个子序列都变得逐渐有序,直到最后一个序列变为完全有序。
总之,希尔排序可以有效提高排序运行效率,而动画演示则是更加形象地展示希尔排序算法的每一个步骤和过程。