介绍
希尔排序也称缩小增量排序,属于插入排序中的一种排序算法,是在插入排序的基础上进行的改进,采用分组策略进行排序。
相关特点
- 时间复杂度:最好:O(n)、最坏:O(n2)、平均:O(n1.3)
- 辅助空间复杂度:O(1)
- 稳定性:不稳定
排序原理
希尔排序通过设定一个初始增量,将数组元素分组进行插入排序。随着增量的逐步减小,每组包含的元素逐渐增多,当增量减至1时,整个数组被分成一组,排序完成。
优点
- 效率较高:在初始阶段通过分组排序快速减少数据量,适合处理大规模数据。
- 适用于部分有序的数据:在数据部分有序的情况下,希尔排序的效率远高于传统的插入排序。
缺点
- 不稳定:由于多次插入排序,相同元素的相对顺序可能会被打乱,因此希尔排序是不稳定的。
- 增量序列的选择:不同的增量序列选择可能会影响算法的性能和结果,进而影响排序的效率。
应用场景
希尔排序适用于大规模数据的快速排序,特别是在数据部分有序的情况下表现优异。它常用于需要高效排序的场景,如数据库管理和大数据处理。
排序步骤
针对序列长度为偶数值的序列
以序列Array=【7 3 5 9 2 0 8 6】为例。
-
定义一个增量,增量的值为序列长度的一半,由此可知,序列Array的增量为8/2=4。
-
根据增量4进行分组,得到4组,分别是(7,2)、(3,0)、(5,8)、(9,6)
-
同组之间进行比较,若前面的值小于后面的值,则不发生变动,否则互换位置。最终得到如下序列
-
重新设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为4,则新的增量值为4/2=2。
-
根据步骤4得到的增量2对序列{2,0,5,6,7,3,8,9}进行分组,得到{2,5,7,8}同组,{0,6,3,9}同组。
-
针对步骤5中的两个同组数值进行从小到大排序,同组序列的排序结果就是{2,5,7,8},{0,3,6,9},合并起来就是
-
继续设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为2,则新的增量值为2/2=1(在排序过程中要一直进行分组,直到增量为1为止)。
-
根据步骤7得到的增量1对序列{2,0,5,3,7,6,8,9}进行分组,把8个数字看成一组,按插入排序进行排序,得到序列
针对序列长度为奇数值的序列
以序列Array=【36 27 20 60 55 7 28 36 67 44 16】为例。
-
定义一个增量,增量的值为序列长度的一半,序列长度为奇数时增量的值向下取整即可,由此可知,序列Array的增量为11/2=5。
-
根据增量5进行分组,得到5组,分别是(36,7,16)、(27,28)、(20,36)、(60,67)、(55,44)
-
同组之间进行比较,若前面的值小于后面的值,则不发生变动,否则互换位置。最终得到如下序列
-
重新设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为5,则新的增量值为5/2=2。
-
根据步骤4得到的增量2对序列{7,27,20,60,44,16,28,36,67,55,36}进行分组,得到{7,20,44,28,67,36}同组,{27,60,16,36,55}同组。
-
针对步骤5中的两个同组数值进行从小到大排序,同组序列的排序结果就是{7,20,28,36,44,67},{16,27,36,55,60},合并起来就是
-
继续设置分组,增量值为前一次分组增量值的一半,前一次分组增量值为2,则新的增量值为2/2=1(在排序过程中要一直进行分组,直到增量为1为止)。
-
根据步骤7得到的增量1对序列{7,16,20,27,28,36,36,55,44,60,67}进行分组,把11个数字看成一组,按插入排序进行排序,得到序列