因为这个排序是一个叫希尔的人发明的,所以就叫希尔排序了。其实希尔排序是插入排序的升级版, 希尔排序根据其排序的特点又叫做缩小增量排序。希尔排序的大体步骤就是先将无序序列按照一定的步长(增量)分为几组,分别将这几组中的数据通过插入排序的方式将其进行排序。然后缩小步长(增量)分组,然后将组内的数据再次进行排序。知道增量为1位置。经过上述这些步骤,我们的序列就是有序的了。其实上述的插入排序就是增量为1的希尔排序,下方会给出相应的示意图以及代码实现。
1.希尔排序示意图
下方就是希尔排序的详细步骤,接下来我们将会对每一步进行详细的解说。如下所示:
-
(1)、首先按照增量进行分组,因为我们要排序的数列有11个,增量初始值是step = 11 / 2 = 5。也就是按照增量为5的步长对数组进行分组。在下方第一步中就是按照增量为5的方式进行分组的。我们将为一组的元素使用直线进行相连,分完组后,我们就将组内中的元素进行插入排序。
-
(2)、将上一步使用的增量进行缩小,也就是本步骤的step = 5 / 2 = 2。 本部分,就要按照2的增量将上一步排序后的数组进行分组,然后再次将每个组内的数据进行插入排序。
-
(3)、再次缩小增量,此刻step = 2 / 2 = 1, 当增量为1时,其实就是我们上一部分的插入排序。将整个数组进行插入排序,然后我们的数组就是有序的了。
具体示意图如下所示:
2、希尔排序的代码实现
根据上述的步骤,然后再结合着插入排序的代码,给出希尔排序相应的代码并不困难。就是将插入排序的步长从1修改成我们每次生成的步长即可,每次增量排序完毕后,我们要对增量按照相应的规则进行缩小即可。下方就是希尔排序的代码实现。
在下方代码中,最外层循环负责增量的生成和缩减,里边的双重循环就是我们之前我们插入排序的代码,不步长要使用我们希尔排序生成的step,具体代码如下所示:
3、运行结果
下方就是Shell排序的运行结果,从下方结果中我们不难看出增量是逐渐减小的。下方的输出结果结合着本部分第一部分的示意图看更为直观一些。