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

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

相关推荐
m0_686041611 分钟前
C++中的适配器模式变体
开发语言·c++·算法
txzrxz1 分钟前
结构体排序,双指针,单调栈
数据结构·算法·双指针算法·单调栈·结构体排序
AndrewHZ5 分钟前
【AI黑话日日新】什么是AI智能体?
人工智能·算法·语言模型·大模型·llm·ai智能体
wWYy.6 分钟前
算法:二叉树最大路径和
数据结构·算法
葱明撅腚8 分钟前
利用Python挖掘城市数据
python·算法·gis·聚类
We་ct11 分钟前
LeetCode 36. 有效的数独:Set实现哈希表最优解
前端·算法·leetcode·typescript·散列表
Serendipity_Carl15 分钟前
1637加盟网数据实战(数分可视化)
爬虫·python·pycharm·数据可视化·数据清洗
流㶡18 分钟前
网络爬虫之requests.get() 之爬取网页内容
python·数据爬虫
weixin_3954489122 分钟前
main.c_cursor_0129
前端·网络·算法
yuankoudaodaokou27 分钟前
高校科研新利器:思看科技三维扫描仪助力精密研究
人工智能·python·科技