美文网首页
希尔排序

希尔排序

作者: 小吉头 | 来源:发表于2022-06-29 07:43 被阅读0次

希尔排序思路

  • 希尔排序是一种分组插入排序算法
  • 首先取一个整数d=n/2,将元素分为d个组,每组相邻两个元素距离为d,各组内进行插入排序
  • 接着取第二个整数d=d/2,重复上面分组排序过程,直到d=1,即所有元素都在一个组内进行插入排序
  • 希尔排序每趟(取一次分组排序完)不能使元素变成有序,但是使整体数据越来越接近有序。最后一趟即d=1排序使得所有数据有序。

示例d=4排序演示:


为什么要分组

分组是为了防止出现插入排序中某个非常小的数插入时前面所有元素(从小到大)都要移动,比如示例中第二组元素1分组后只要移动很少的步数,加快了插入的速度
示例中,当d=1时,列表变成[4,0,5,1,7,2,8,3,9],此时插入的复杂度相对初始列表会低很多。

代码实现

#插入排序将1替换成d
def insert_sort_gap(li,d):#从d下标开始,可以对照上面的示例图,即从元素8开始
    n = len(li)
    for i in range(d,n):
        tmp = li[i]
        j = i - d
        while j >=0 and li[j] > tmp:
            li[j+d] = li[j]
            j -= d
        li[j + d] = tmp


li = [5,9,7,3,8,1,4,0,2]
d = len(li) // 2
while d > 0:
    insert_sort_gap(li,d)
    d = d // 2
print(li)
>>>[0, 1, 2, 3, 4, 5, 7, 8, 9]

时间复杂度

相比插入排序提升很大,但是比快速排序、归并排序、堆排序慢
具体的计算方式可以自行查阅

相关文章

  • 排序算法(二)之希尔排序

    图解排序算法(二)之希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也...

  • 07-希尔排序(Shell Sort)

    希尔排序(Shell Sort) 希尔排序是唐纳德·希尔(Donald Shell)在0959年提出的。希尔排序与...

  • 排序-希尔排序(分治)

    希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序...

  • swift经典算法-希尔排序

    希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序...

  • 排序算法④——希尔排序

    希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序...

  • 排序算法-希尔排序(Java实现)

    希尔排序 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是...

  • 说说算法那些事-希尔排序

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,希尔排序法又称...

  • 希尔排序学习

    希尔排序希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是基...

  • 排序算法(四) 希尔排序(插入排序的进化)

    参考Java排序算法(四):希尔排序常见排序算法 - 希尔排序 (Shell Sort) 希尔排序算法是按其设计者...

  • 编程马拉松 Day04 希尔排序、归并排序、快速排序

    本文将介绍三个高级排序算法 希尔排序 归并排序 快速排序 希尔排序 希尔排序(Shell's Sort)的名称源于...

网友评论

      本文标题:希尔排序

      本文链接:https://www.haomeiwen.com/subject/unduzktx.html