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

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

相关推荐
卷无止境42 分钟前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
zhanghaha13141 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
Python私教1 小时前
API 输出模型怎么设计:从 model_dump() 到显式展示层
python·fastapi
白狐_7981 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
Python私教2 小时前
本地 AI 工具服务该绑定 127.0.0.1 还是 0.0.0.0?
python·fastapi
zander2582 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
卷无止境2 小时前
FastAPI 的Admin面板生态
后端·python
Shell运维手记2 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI2 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
ctlover3 小时前
Streamlit 框架
python