🇨🇳
阿臻的学习笔记
  • 🤖AI
    • 📑README
    • 🕒Scheduling
      • 一种JSSP的DRL环境
    • 📜Paper
      • 神经协同过滤
      • 非侵入信号深度学习
      • 肾透析移植机器学习
      • 心理学随机森林
      • P300数据学习
    • ⚒️Pytorch
      • 1.1数据基础
      • 1.2自动梯度
      • 1.3神经网络
      • 1.4模型实现
      • 2数据操作
    • 🛠️Ray+Gym
    • 📃Graph Neural
      • 图神经网络基础
      • Contrastive Multi-View Representation Learning on Graphs
    • 📽️Deep Learning
      • 《第一章》
      • 《第二章》
      • 《第三章》
      • 《第四章》
      • 台湾陈蕴侬视频2020
    • 🔨MXNet
      • 《第一章》《第二章》
      • 《第三章》
      • 《第四章》
      • 《第五章》
      • 《第六章》
      • 《第七章》
      • 《第八章》
      • 《第九章》
      • 《第十章》
  • 👨‍🏭Study
    • 📔Algorithm
      • Leetcode
        • 第一天(乱刷)
        • 第二天(栈)
        • 第三天(栈)
        • 第四天(堆)(贪心)
        • 第五天(贪心)
        • 第六天(贪心)
        • 第七天(排序)
        • 第八天(排序)
        • 第九天(排序)
        • 第十天(位运算)
        • 第十一天(位运算)
        • 第十二天(位运算)
        • 第十三天(位运算)
        • 第十四天(树)
        • 第十五天(树)
        • 第十六天(树)
        • 第十七天(树)
        • 第十八天(树)
        • 第十九天(树)
        • 第二十天(树)
        • 第二十一天(树)
        • 第二十二天(并查集)
        • 第二十三天(并查集)
        • 第二十四天(DFS)(图)
        • 第二十五天(图)(设计)
        • 第二十六天(拓扑)
        • 第二十七天(字典树)
        • 第二十八天(字典树)
        • 第二十九天(树状数组)(二叉搜索树)
        • 第三十天(递归)
        • 第三十一天(脑筋急转弯)
        • 第三十二天(脑筋急转弯)
        • 第三十三天(记忆化)
        • 第三十四天(队列)
        • 第三十五天(队列)
        • 第三十六天(极小化极大)
        • 第三十七天(几何)
        • 第三十八天(蓄水池抽样)
        • 第三十九天(数组)
        • 第四十天(数组)
        • 第四十一天(数组)
        • 第四十二天(数组)
        • 第四十三天(数组)
        • 第四十四天(数组)
        • 第四十五天(数组)
        • 第四十六天(数组)
      • Sort
        • 最小堆
        • 归并排序(merge_sort)
    • 📓Knowledge
      • python补码
    • 🔧Other
      • pythonic语法
      • Ubuntu备忘
由 GitBook 提供支持
在本页

这有帮助吗?

导出为 PDF
  1. Study
  2. Algorithm
  3. Sort

最小堆

"""
  (1)堆的数据要基于链表(List)进行操作(堆中的数据是基于链表进行操作)。

  (2)堆直接基于链表操作,不再开辟新的存储空间。

  (3)堆头永远都是最小的值。

  (4)堆的检索是根据中序遍历方式:根节点 --> 左节点 -->右节点
"""
import heapq

# (1)创建一个空堆,并加入数据
heap = []
for item in [2, 3, 1, 4]:
    heapq.heappush(heap, item)
print(heap)  # 输出 [1, 3, 2, 4]

# (2)根据链表构建一个堆 --> heapify
l = [2, 3, 1, 4]
heapq.heapify(l)
print(l)  # 输出 [1, 3, 2, 4]

# (2)向堆中追加元素 -->heappush
heapq.heappush(l, -10)
print(l)  # 输出 [-10, 1, 2, 4, 3]

# (3) 弹出堆头(返回堆头之后堆再进行翻转,堆头保持最小值) -->heappop
print(heapq.heappop(l))  # 输出 -10
print(l)  # 输出 [1, 3, 2, 4]
print(heapq.heappop(l))  # 输出 1
print(l)  # 输出 [2, 3, 4]

# (4) 替换第一个元素,并构建堆 --> heapreplace
l = [2, 3, 1, 4]
print(heapq.heapreplace(l, 100))  # 输出 2
print(l)  # 输出 [1, 3, 100, 4]

# (5)合并多个链表 --> merge
l = [1, 3, 2]
l2 = [5, 2, 3]
l3 = [9, 2, 3, 1]
print(list(heapq.merge(l, l2, l3)))  # 输出 [1, 3, 2, 5, 2, 3, 9, 2, 3, 1]

# (6)多路归并 --> merge
#  对每一个链表进行排序,再对排序后的列表进行合并
print(list(heapq.merge(sorted(l), sorted(l2), sorted(l3))))

# (7)返回最大的元素 --> nlargest
l = [2, 3, 1, 4]
print(heapq.nlargest(2, l))  # 输出 [4, 3]

# (8)返回最小的元素 --> nsmallest
l = [2, 3, 1, 4]
print(heapq.nsmallest(2, l))  # 输出 [1, 2]

# (9)向堆中追加一个数据,再弹出堆头(弹出后堆不会发生翻转) --> heappushpop
l = [2, 3, 1, 4]
print(heapq.heappushpop(l, -10))  # 输出 -10
print(l)  # 输出 [2, 3, 1, 4]
上一页Sort下一页归并排序(merge_sort)

最后更新于2年前

这有帮助吗?

👨‍🏭
📔