备战蓝桥杯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

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

相关推荐
浅念-3 分钟前
C++ 模板初阶:从泛型编程到函数模板与类模板
c语言·开发语言·数据结构·c++·笔记·学习
学Linux的语莫7 分钟前
skills的使用
java·数据库·python
Bear on Toilet10 分钟前
BFS_FloodFill_46 . 腐烂的橘子问题
数据结构·c++·算法·leetcode·宽度优先
大模型玩家七七11 分钟前
关系记忆不是越完整越好:chunk size 的隐性代价
java·前端·数据库·人工智能·深度学习·算法·oracle
样例过了就是过了13 分钟前
LeetCode热题100 找到字符串中所有字母异位词
算法·leetcode
DevilSeagull13 分钟前
C语言: C语言内存函数详解
c语言·开发语言·算法
搞科研的小刘选手20 分钟前
【人工智能专题】2026年人工智能与生成式设计国际学术会议(ICAIGD 2026)
人工智能·算法·aigc·生成式ai·学术会议·计算机工程·生成式设计
stripe-python33 分钟前
十二重铲雪法(上)
c++·算法
像风一样的男人@44 分钟前
python --打包pyd或so文件
开发语言·python
愚者游世1 小时前
long long各版本异同
开发语言·c++·程序人生·职场和发展