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


    一、每日一题

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

    我的解法:

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

    1. a,b = map(int, input().split()) # 实现在一行中输入两个数据
    2. s = a ** b
    3. count = 0
    4. def gcd(m, n): # 定义判断最大公约数的函数
    5. while n != 0:
    6. m, n = n, m % n
    7. return m
    8. for i in range(s+1): # 在循环中判断这两个数的最大公约数是否为1
    9. if gcd(i, s) == 1:
    10. count += 1
    11. print(count) # 最后输出结果

    二、堆排序的实现 

    向下调整的实现

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

    1. def sift(li, low, high):
    2. """
    3. :param li: 用列表存放树结构
    4. :param low: 堆的根节点位置
    5. :param high: 堆的最后一个元素的位置
    6. :return:
    7. """
    8. i = low # i最开始指向根节点
    9. j = 2 * i + 1 # j最开始指向左孩子
    10. tmp = li[low] # 将栈顶保存起来
    11. while j <= high: # 循环条件为只要j不越过列表的界
    12. if j + 1 <= high and li[j] < li[j+1]: # 如果右孩子有,并且比左孩子大
    13. j = j+1 # 那么把指针指向数字大的右孩子
    14. if li[j] > tmp:
    15. li[i] = li[j] # 将i位置赋值为较大的数
    16. i = j # 并将i,j指针向下移动
    17. j = 2 * i +1
    18. else: # 如果tmp更大,将tmp放到i的位置上
    19. li[i] = tmp # 把tmp放到某个子树的根节点上
    20. break
    21. else:
    22. li[i] = tmp # 把tmp放到叶子节点上

    堆排序函数

    1. def heap_sort(li):
    2. n = len(li)
    3. for i in range((n-2)//2, -1, -1):
    4. # i 表示建堆的时候调整的堆的下标
    5. sift(li, i, i-1)
    6. # 建堆完成了
    7. for i in range(n-1, -1, -1):
    8. # i指向当前堆的最后一个元素
    9. li[0], li[i] = li[i], li[0]
    10. sift(li, 0, i-1) # i-1是新的high

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

  • 相关阅读:
    【Python 数据科学】Dask.array:并行计算的利器
    OSI七层模型&TCP四层模型横向对比
    小项目第三天
    数据结构与算法之美-读书笔记3
    Blocking waiting for file lock on the registry index 问题解决
    数组传回后端总显示为空怎么解决
    数仓分层设计及数据同步问题,,220728,,,,
    10、Python函数命名空间、作用域(LEGB)及Global
    做一篇人人能搞懂的ThreadLocal(源码)
    vue3 学习笔记01 -- 搭建项目及基础配置
  • 原文地址:https://blog.csdn.net/2301_78820199/article/details/136380716