十大排序算法的python实现(三:插入排序和希尔排序)

编程小白最近在学习算法,自己用python写了十大排序算法,发出来供大家参考。如有不足之处,欢迎批评讨论。

第三是两种插入排序:直接插入排序和堆排序。

from math import ceil

def insertSort(nums: list) -> list:
    """
    插入排序
    :param nums:待排序序列
    :return:排序后序列(注意:原地排序,返回原来的列表对象)
    """
    # 遍历从第二个元素到最后一个元素,因为第一个元素本身已处于排序状态
    for i in range(1, len(nums)):
        currentVal = nums[i]
        position = i
        # 向前寻找插入的正确位置,条件:必须还未到达列表开头,并当前位置的前一个元素大于当前需要插入的值
        while position > 0 and nums[position - 1] > currentVal:
            nums[position] = nums[position - 1]  # 将元素后移,为当前需要插入的元素腾出空间
            position -= 1
        nums[position] = currentVal  # 插入当前元素到正确位置
    return nums

def shellSort(nums: list) -> list:
    """
    希尔排序
    :param nums:待排序序列
    :return:排序后序列(注意:原地排序,返回原来的列表对象)
    """
    step = len(nums) // 2  # 初始步长设置为列表长度的一半
    while step > 0:
        # 遍历每个分组,组数向上取整
        for group in range(ceil(len(nums) / step)):
            nums[group::step] = insertSort(nums[group::step])  # 使用切片操作来获取当前分组的元素,步长为当前的步长,并对每个分组应用插入排序
        step //= 2  # 步长缩减到原来的一半,逐步减小分组大小,直到步长为1
    return nums

if __name__ == '__main__':
    from random import choices
    nums = list(choices(range(100), k=10))
    print('Before sorting:', nums)
    print('After insertSort sorting:', insertSort(nums))
    print('After shellSort sorting:', shellSort(nums))

输出:

Before sorting: [41, 93, 9, 37, 71, 49, 65, 66, 38, 99]
After insertSort sorting: [9, 37, 38, 41, 49, 65, 66, 71, 93, 99]
After shellSort sorting: [9, 37, 38, 41, 49, 65, 66, 71, 93, 99]

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值