1224学习笔记

本文详细介绍了Python中的三种排序算法:希尔排序、快速排序和归并排序。希尔排序通过设置不同的步长进行插入排序,时间复杂度在最坏情况下为O(n^2)。快速排序使用双指针和递归实现,平均时间复杂度为O(nlogn),最坏情况为O(n^2)。归并排序利用分治策略,始终保持稳定且时间复杂度为O(nlogn)。文章还提到了查找法中的二分查找法及其适用场景。
摘要由CSDN通过智能技术生成

Python数据结构篇(排序算法2)

1希尔排序

1.1 希尔排序的原理

根据步长gap的不同将数列分成n/gap个子序列,然后把子序列进行插入排序,然后不断缩小gap,直到gap=1.

初始gap=n/2
然后每次gap/2直到=1
gap的取值和缩小方法可以自定义!!!
在这里插入图片描述

1.2 希尔排序实现:

实现1:完全按照希尔的思路来做,先确定gap 然后分子序列,然后插入排序!!(4个循环)但是最坏时间复杂度是O(n2)

# 比较拙略的方法,但是也是用希尔排序实现了
def shell_sort_my_bad(items):
    len_items = len(items)
    gap = len_items // 2

    while gap > 0:
        # 首先要根据gap,分出来gap个子序列
        for i in range(0, gap):
            # 子序列的表示方法是:(i,i+gap,i+2gap.....)<len,然后对子序列进行插入排序
            j = i
            # 先写一个插入排序
            while j < len_items:
                b = j
                while b > 0:
                    if items[b] < items[b - gap]:
                        items[b], items[b - gap] = items[b - gap], items[b]
                    else:
                        break
                    b -= gap
                j += gap
        gap = gap // 2
    print(items)

实现2:比较简洁的写法,把分子序列和插入排序的外部大循环结合到一起(因为分完子序列以后,每个子序列的每个元素也需要进行-gapd 插入的操作,分完再插和每个元素直接插效果是一样的,不如直接写在一起)

def shell_sort(items):
    len_items = len(items)
    gap = len_items // 2

    while gap > 0:
        # 不分子序列了,反正i=gap之后的元素都要在自己的子序列里面沉底,不如一起操作,把所有子序列放在一个遍历里面操作
        for i in range(gap, len_items):
            j = i     
            # 而且每个序列,排回去的最后一个元素其实不用操作,所以大于等于gap就可以了
            while j >= gap:
                if items[j] < items[j - gap]:
                    items[j], items[j - gap] = items[j - gap], items[j]
                else:
                    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值