备战蓝桥杯Day20 - 堆排序的实现

一、每日一题

蓝桥杯真题之互质数的个数

我的解法:

两个数互质,说明两个数的最大公约数是1,定义了一个函数判断两个数的最大公约数,再在循环中判断,并实现计数。可以实现运行,缺点是时间复杂度很高,运行时间慢。

python 复制代码
a,b = map(int, input().split())  # 实现在一行中输入两个数据
s = a ** b
count = 0


def gcd(m, n):   # 定义判断最大公约数的函数
    while n != 0:
        m, n = n, m % n
    return m


for i in range(s+1):   # 在循环中判断这两个数的最大公约数是否为1
    if gcd(i, s) == 1:
        count += 1

print(count)  # 最后输出结果

二、堆排序的实现

向下调整的实现

有详细的注释,但是还是不好理解,确实是挺难挺复杂的,建议大家是去b站找视频仔细看看讲解并自己动手实践!!如果我有时间了话会再出详细的图解或者视频。

python 复制代码
def sift(li, low, high):
    """

    :param li: 用列表存放树结构
    :param low: 堆的根节点位置
    :param high: 堆的最后一个元素的位置
    :return:
    """
    i = low   # i最开始指向根节点
    j = 2 * i + 1   # j最开始指向左孩子
    tmp = li[low]   # 将栈顶保存起来
    while j <= high:  # 循环条件为只要j不越过列表的界
        if j + 1 <= high and li[j] < li[j+1]:   # 如果右孩子有,并且比左孩子大
            j = j+1    # 那么把指针指向数字大的右孩子
        if li[j] > tmp:
            li[i] = li[j]   # 将i位置赋值为较大的数
            i = j   # 并将i,j指针向下移动
            j = 2 * i +1
        else:  # 如果tmp更大,将tmp放到i的位置上
            li[i] = tmp   # 把tmp放到某个子树的根节点上
            break
    else:
        li[i] = tmp   # 把tmp放到叶子节点上

堆排序函数

python 复制代码
def heap_sort(li):
    n = len(li)
    for i in range((n-2)//2, -1, -1):
        # i 表示建堆的时候调整的堆的下标
        sift(li, i, i-1)
    # 建堆完成了
    for i in range(n-1, -1, -1):
        # i指向当前堆的最后一个元素
        li[0], li[i] = li[i], li[0]
        sift(li, 0, i-1)  # i-1是新的high

实现过程真的不好写,不好理解,多加练习!

相关推荐
阿俊仔(摸鱼版)几秒前
Python 常用运维模块之Shutil 模块
linux·服务器·python·自动化·云服务器
MarsBighead2 分钟前
(二)PosrgreSQL: Python3 连接Pgvector出错排查
python·postgresql·向量数据库·pgvector
凭君语未可10 分钟前
豆包MarsCode:小C点菜问题
算法
深蓝海拓22 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
C语言魔术师29 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
自由自在的小Bird30 分钟前
简单排序算法
数据结构·算法·排序算法
无须logic ᭄30 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
Channing Lewis43 分钟前
flask常见问答题
后端·python·flask
Channing Lewis1 小时前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月2 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉