算法绘本-希尔排序

希尔排序是插入排序(参考算法绘本-插入排序)的优化,由Donald Shell于1959年提出。其原理是将相隔一定步长的元素分为一组,对组内的元素进行插入排序,然后将步长缩短,再对所有元素分组,对组内的元素进行插入排序,如此反复,直到最后所有元素为一组进行最后一次插入排序,得出最后的排序结果。在前几轮的分组排序过程中,会让元素趋于基本有序,从而提高排序效率。

下面举个例子,给定一系列初始顺序的数字如下(方框下面的数字为下标):

image-20240410200116369.png

总共有7个元素,计算第一轮步长7 / 2 = 3.5,向下取整为3,根据步长3对上面的数字分组,数组5,0,1为一组,数字4,6为一组,数字8,2为一组。这里为了更直观反映出分组情况,将同一组的数字放在一起

image-20240410200431605.png

然后分别对每组数字进行插入排序,排序后每组中的数字如下

image-20240410202739377.png

按下标从小到大就是

image-20240410202948962.png

然后进行第二轮分组排序,第二轮缩小步长,用7 / 3 = 2.5,取步长为2,根据步长2对上面的数字分组,数字0,2,6,5为一组,数组4,7,8为一组

image-20240410203118366.png

然后再对每组内的数字进行插入排序,每组内的数组排序后如下

image-20240410203331093.png

按下标从小到大就是

image-20240410203412727.png

从上面的数字可以看出,这时候整体已经基本有序了,只有最后两个数字的顺序不对。接着进行第三轮分组排序,第三轮缩小步长,用7 / 4 = 1.75,取步长为1,根据步长1对上面的数字分组,只能分为一组,所以这一轮是对所有数字进行一次插入排序,最终得到如下的顺序

image-20240410203806667.png

总结
  • 因为希尔排序时步长的选择不同,排序的时间不同,所以希尔排序的时间复杂度和步长算法有关
  • 希尔排序和插入排序一样,只需要一个额外的空间用于交换元素位置,所以空间复杂度为O(1)
  • 希尔排序是不稳定的,因为相同的元素可能会分配到不同的组排序,导致排序后的顺序和原来的顺序不一样
  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值