希尔排序----python

1. 插入排序

先来复习一下插入排序,类似于我们打牌时手中的牌,当我们摸一张牌的时候都会将这一张牌按照顺序插入到一个合适的位置。

a = [7,5,9,2,1,8,3]
print('排序前:',a)

for i in range(1,len(a)):   # 第i个数(从第二个数开始)
    for j in range(i-1,0,-1): # 和i之前的每一个数进行比较
        if a[j] < a[j-1]:   # 如果第 i 个数 小于i之前的数,交换位置
            temp = a[j]
            a[j] = a[j-1]
            a[j-1] = temp
        else:
            break
    print(a)
print('排序后:',a)

2. 希尔排序

希尔排序也被称为缩小增量排序。可以理解为是插入排序的的一种更高效的实现。

希尔排序思路: 将要排序的列表分成多组子序列,将这些子序列进行排序

1.首先取列表长度整除2(初始每组元素距离gap),并且每个元素之间的距离为gap,然后将这个子序列进行插入排序
2.取第二个元素距离gap,在上一次的gap整除2,然后进行排序
3. 一直重复这个过程,后面的gap都是在上一次的gap的基础上整除2,直到gap等于1

在这里插入图片描述
当gap等于4时

当gap等于2时

在这里插入图片描述
当gap等于1时
在这里插入图片描述

3. 代码实现

def insert_sort(li):
    # 初始每组相邻元素之间的距离
    gap = len(li) // 2
    while gap > 0:
        print('gap:', gap)
        for i in range(gap, len(li)):
            temp = li[i]
            j = i - gap
            # 各组进行排序
            while j >= 0 and temp < li[j]:
                li[j + gap] = li[j]
                j = j - gap
            li[j + gap] = temp
            print(li)
        # 新相邻元素之间的距离
        gap //= 2


a = [7, 8, 4, 6, 1, 5, 9, 2, 3]

print('排序前:', a)

insert_sort(a)
print('排序后:', a)
def shell_sort(a):
    n = len(a)
    gap = n // 2
    while gap > 0:
        print('gap:',gap)
        for i in range(gap, n):
            for j in range(i, gap - 1, -gap):
                if a[j] < a[j - gap]:
                    a[j], a[j - gap] = a[j - gap], a[j]
                else:
                    break
            print(a)
        gap //= 2
    return a


a = [7, 8, 4, 6, 1, 5, 9, 2, 3]
print('排序前:', a)
shell_sort(a)
print('排序后:', a)
def insert_sort_gap(a, gap):
    for i in range(gap, len(a)):
        temp = a[i]
        j = i - gap
        while j >= 0 and temp < a[j]:
            a[j + gap] = a[j]
            j = j - gap
        a[j + gap] = temp
        print(a)


def shell_sort(a):
    d = len(a) // 2
    while d >= 1:
        print('\ngap:', d)
        insert_sort_gap(a, d)
        d //= 2
        print(a)


a = [7, 8, 4, 6, 1, 5, 9, 2, 3]
print('排序前:', a)
shell_sort(a)
print('排序后:', a)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1024节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值