创建最大(小)堆

二叉堆本质上是一种完全二叉树,存储方式并不是链式存储,而是顺序存储

  • 堆操作:插入(叶子节点上调),删除(堆顶元素下沉)

  • 堆创建:非叶子节点下沉(从最后一个非叶子节点开始)

    • 最小堆:

      最小堆任何一个父节点的值,都小于等于它左右孩子节点的值

      创建过程:如果非叶子节点值大于其子节点,将其下沉

    • 最大堆:

      最大堆任何一个父节点的值,都大于等于它左右孩子节点的值。

      创建过程:如果非叶子节点值小于其子节点,将其下沉

#最小堆
def upadjust(nums):
childindex = len(nums)-1
parentindex = (childindex-1)//2
temp = nums[childindex] #插入的叶子节点值
while childindex>0 and temp<nums[parentindex]:#子节点小于父节点,上调子节点
nums[childindex] = nums[parentindex]
childindex = parentindex
parentindex = (parentindex-1)//2
nums[childindex] = temp def downadjust(nums,parentindex):
temp = nums[parentindex]
childindex = 2*parentindex + 1
while childindex < len(nums):
#右孩子值小于左孩子,父节点和小的交换
if childindex +1 <len(nums) and nums[childindex+1] < nums[childindex]:
childindex += 1
if temp < nums[childindex]: #父节点小于子节点,不用调整
break
nums[parentindex] = nums[childindex]
parentindex = childindex
childindex = childindex*2+1
nums[parentindex] = temp def buildMinHeap(nums):
for i in range((len(nums)-1)//2,-1,-1):
downadjust(nums,i)
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> buildMinHeap(nums)
>>> nums
[0, 5, 6, 8, 9, 2, 1, 7, 3]
#最大堆
#非叶子节点小值下沉
def downadjust(nums,parentindex):
temp = nums[parentindex]
childindex = 2*parentindex + 1
while childindex < len(nums):
if childindex +1 <len(nums) and nums[childindex+1] > nums[childindex]:#右孩子值大于左孩子,父节点和大的交换
childindex += 1
if temp > nums[childindex]: #父节点大于子节点,不用调整
break
nums[parentindex] = nums[childindex]
parentindex = childindex
childindex = childindex*2+1
nums[parentindex] = temp def buildMaxHeap(nums):
for i in range((len(nums)-1)//2,-1,-1):
downadjust(nums,i)
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> buildMaxHeap(nums)
>>> nums
[9, 8, 6, 7, 5, 2, 1, 3, 0]

python自带堆模块

>>> import heapq
#默认最小堆
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> heapq.heapify(nums)
>>> nums
[0, 3, 1, 5, 9, 2, 6, 7, 8]

创建堆(python)的更多相关文章

  1. 通过元类创建一个Python类

    通过元类创建一个Python类 最开始学pytohn的时候我们这样定义类 class ClassName: pass 当熟悉了元类的概念之后我们还可以这样创建 ClassName = type(&qu ...

  2. 解决vs2013下创建的python文件,到其他平台(如linux)下中文乱码(或运行时报SyntaxError: (unicode error) 'utf-8' codec can't decode byte...)

    Vs2013中创建python文件,在文件中没输入中文时,编码为utf-8的,如图 接着,在里面输入几行中文后,再次用notepad++查看其编码如下,在vs下运行也报错(用cmd运行就不会): 根据 ...

  3. linux 下创建虚拟环境 python

    virtualenv是一个可以在同一计算机中隔离多个python版本的工具.有时,两个不同的项目可能需要不同版本的python,如 python2.7 / python3.6 ,但是如果都装到一起,经 ...

  4. 创建堆 HeapCreate

    创建额外的堆的原因1.对组件进行保护2.更有效的内存管理3.局部访问4.避免线程同步开销5.快速释放 HeapCreate函数原型:HANDLE WINAPI HeapCreate( _In_ DWO ...

  5. PyCharm中创建项目时,在所创建的python虚拟环境下的pip失效

    在这篇博文里,我简单地叙述了我在使用PyCharm创建一个flask项目时遇到的问题,以及我解决这个问题的过程.其中比较值得注意的点有:①PyCharm创建新项目时的解释器配置②Python虚拟环境的 ...

  6. 创建指定python版本的虚拟环境

    使用virtualenvwrapper管理虚拟环境 鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper. virtualenvwrapper提供了一系 ...

  7. ros2中创建一个python package

    完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...

  8. 创建一个python类 ,self init相关参数的简单介绍

    一 创建 ''' 一 使用python 语法 创建一个类, 探究self 是干啥的 1 创建一个对象 car 2 写入两个行参 3 定义两个方法 ''' class Car(): ''' 二 init ...

  9. 2019-01-29 VS Code创建自定义Python代码片段

    续前文[日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频最后的想法, 发现VS Code支持用户自定义代码片段: Creating your own snip ...

随机推荐

  1. 会话存储sessionStorage

    会话存储的工作方式和本地存储的工作方式很接近,不同之处在于数据是各个浏览器上下文私有的,会在文档被关闭时移除(注意是被关闭时才移除,刷新是不会移除的).我们通过全局sessionStorage访问会话 ...

  2. 关于pytorch在windows上编辑的问题集合

    cmake在windows上自动寻找v140(VS2015)的编译器,现在只有VS2013的IDE,所以要修改编译器 修改掉VS2015的编译器名称,报错提示参数CMAKE_C_COMPILER和CM ...

  3. Android开发:通过 webview 将网页打包成安卓应用

    商业转载请联系作者获得授权,非商业转载请注明出处. For commercial use, please contact the author for authorization. For non-c ...

  4. 4L-线性表之数组

    关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力.后台回复 "加群" 进入技术交流群获更多技术成长. 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同 ...

  5. macOS开发:调整NSImage尺寸大小

    原文链接 extension NSImage { func resize(_ to: CGSize, isPixels: Bool = false) -> NSImage { var toSiz ...

  6. 环境篇:VMware Workstation安装Centos7

    环境篇:VMware Workstation安装Centos7 1 VMware Workstation安装 CentOS下载地址:http://isoredirect.centos.org/cent ...

  7. VScode 快捷键大全

    按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + ...

  8. JavaScript 模式》读书笔记(4)— 函数2

    这篇,我们仍旧继续学习函数. 二.回调模式 函数都是对象,这表示它们可以作为参数传递给其它函数. function writeCode(callback) { // 执行一些事务... callbac ...

  9. Mysql - 删除表时出现: Cannot delete or update a parent row: a foreign key constraint fails

    现象 MySQL在删除一张表时出现 ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint ...

  10. 树莓派3B+安装&卸载mysql

    需求 在树莓派上 安装Mysql 服务,并开启远程访问 步骤 安装 mysql server 1 $ sudo apt-get install mysql-server 我以为中间会让我提示输入 数据 ...