构造最小堆、最小堆排序

news2024/12/27 11:43:33

堆是一种特殊的完全二叉树

堆具有以下方法
在这里插入图片描述
关键点:

  1. 插入:在 store 末端插入新元素,然后把新元素上浮。
  2. 弹出:将 store 顶端(索引为0处)弹出,作为最小元素;把末端元素放到索引0处,从索引0开始执行下沉操作。

构造最小堆(Python)

class MinHeap:
    def __init__(self):
        self.store = []
        
    def insert(self, ele):
        self.store.append(ele)
        self.shiftUp(self.size() - 1)
    def swap(self, i, j):
        t = self.store[i]
        self.store[i] = self.store[j]
        self.store[j] = t

    def getParent(self, index):
        return (index - 1) // 2

    def shiftUp(self, index):
        if index == 0:
            return
        if self.store[index] < self.store[self.getParent(index)]:
            self.swap(index, self.getParent(index))
            self.shiftUp(self.getParent(index))
    

    def getLeftChild(self, index):
        return index * 2 + 1
    def getRightChild(self, index):
        return index * 2 + 2
    
    def peek(self):
        if self.size() >= 0:
            return self.store[0]
        else:
            return None

    def pop(self):
        if self.size() == 0:
            return None
        if self.size() == 1:
            t = self.store.pop()
            return t
        t = self.store[0]
        
        self.store[0] = self.store.pop()	# move the last one to the place that index == 0
        self.shiftDown(0)
        return t

    def shiftDown(self, index):
        left = self.getLeftChild(index)
        right = self.getRightChild(index)
        if left < self.size() and self.store[index] > self.store[left]:
            self.swap(index, left)
            self.shiftDown(left)
        if right < self.size() and self.store[index] > self.store[right]:
            self.swap(index, right)
            self.shiftDown(right)
    def size(self):
        return len(self.store)

使用最小堆对数组排序

g = [2, 5, 1, 7, 8, 4, 9, 6, 7, 0, 11]

h = MinHeap()
for e in g:
    h.insert(e)

res = []
for i in range(0, len(g)):
    res.append(h.pop())

print(res)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态表单生成Demo(Vue+elment)

摘要&#xff1a;本文将介绍如何使用vue和elment ui组件库实现一个简单的动态表单生成的Demo。主要涉及两个.vue文件的书写&#xff0c;一个是动态表单生成的组件文件&#xff0c;一个是使用该动态表单生成的组件。 1.动态表单生成组件 这里仅集成了输入框、选择框、日期框三种…

WebAssembly完全入门——了解wasm的前世今身

前言 接触WebAssembly之后&#xff0c;在google上看了很多资料。感觉对WebAssembly的使用、介绍、意义都说的比较模糊和笼统。感觉看了之后收获没有达到预期&#xff0c;要么是文章中的例子自己去实操不能成功&#xff0c;要么就是不知所云、一脸蒙蔽。本着业务催生技术的态度&…

Linux 环境下 安装 Elasticsearch 7.13.2

Linux 环境下 安装 Elasticsearch 7.13.2 前言镜像下载&#xff08;国内镜像地址&#xff09;解压安装包修改配置文件用 Es 自带Jdk 运行配置 Es 可被远程访问然后启动接着启动本地测试一下能不能连 Es 前言 借公司的 centos 7 服务器&#xff0c;搭建一个 Es&#xff0c;正好熟…

8.3 矢量图层点要素单一符号使用五

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染几何生成器&#xff08;Geometry generator&#xff09;QGis代码实现 总结 前言 上一篇教程介绍了矢量图层点要素单一符号中填充标记的用法本章继续介绍单一符号中各种标记的用法说明&#xff1a;文章中的示例…

AR的光学原理?

AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成&#xff0c;可以将其理解为智能手机的屏幕。 增强现实&#xff0c;从本质上说&#xff0c;是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…

java项目之中学校园网站(ssm框架)

项目简介 中学校园网站实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、教师管理、学生管理、校园概况管理、名师风采管理、校园公告管理、试卷管理、试题管理、校园论坛、系统管理、考试管理。教师&#xff1a;个人中心、校园概况管理、名师风采管理、校园公告管理…

PM866 3BSE050200R1 L003748-AR 3BSX108237R300

PM866 3BSE050200R1 L003748-AR 3BSX108237R300 工业自动化制造商和工业物联网工具开发商Opto 22宣布推出新版groov&#xff0c;将IIoT technologies MQTT和OPC-UA驱动程序直接嵌入其工业边缘设备。新版本添加到用于web和移动可视化的groov View软件以及开源的Node-RED开发环境…

第三方支付预付卡业务详解

第三方支付预付卡业务详解 第三方支付预付卡业务是指由第三方支付公司提供的一种预先充值后消费的支付方式。用户可以在第三方支付平台上购买预付卡&#xff0c;然后在指定的商户或者服务提供商那里进行消费。 运作模式&#xff1a; 1. 用户在第三方支付平台购买预付卡&#xf…

Django项目单字段的区间查询

在Django项目中会碰到一些需求就是查询某个表中的一些字段从某日到某日的数据&#xff0c;而且是对但字段查询这个时候我们有两两种方法解决 单字段类型是DateTimeField的 查询日期范围的 这个时候在filter.py里面重写DateTimeFromToRangeFilter&#xff0c;为什么要重写呢&am…

kubernetes部署(web界面)

基本队对象 pod 最小单位 service 跟网络相关 Volume Namespace 准备工作&#xff1a; master node1 node2 修改主机名&#xff1a; 做本地解析 10.0.0.51 master 10.0.0.56 node-1 10.0.0.186 node-2 关闭swap分区&#xff1a; swapoff -a  临时关闭 …

双点双向重发布解决方案

某公司有两张园区网络&#xff0c;分别是A园区和B园区&#xff0c;由于业务需求&#xff0c;需要将两张园区网络整合到一起&#xff0c;实现互联互通。 因此管理员将AR2-AR4、AR3-AR5通过物理线缆相连&#xff0c;并且此互联链路运行在ospf 100中。 现在要求工程师在AR2和AR3…

AD教程(三)IC类元件模型的创建

AD教程&#xff08;三&#xff09;IC类元件模型的创建 IC类元件 IC芯片&#xff08;Intergrated Circuit Chip&#xff09;是将大量的微电子元器件&#xff08;晶体管、电阻、电容等&#xff09;形成的集成电路放在一块塑基上&#xff0c;做成一块芯片。 IC类元件的创建 新…

JAVA发票管理的收货单订单创建发票详情介绍

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

用十万字讲明白linux和java的零复制技术

linux I/O 读写方式 Linux提供了轮询、I/O中断以及DMA传输这3种磁盘与主存之间的数据传输机制。 轮询方式是基于死循环对 I/O 端口进行不断检测。 I/O中断方式 I/O 中断方式是指当数据到达时&#xff0c;磁盘主动向 CPU 发起中断请求&#xff0c;由 CPU 自身负责数据的传输…

10.31一些代码分析,香浓展开,移位器(桶形多位),二进制转格雷码

always的block之间&#xff0c;采用并行执行 always之内&#xff0c;采用非阻塞赋值&#xff0c;为顺序执行 一些代码分析 这个把使能信号和W信号组合在一起&#xff0c;进行case语句&#xff0c;即只有合并信号最高位为1时&#xff0c;才进行操作 always后面要写&#xff0…

springboot大学生就业推荐系统 毕业设计-附源码01535

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对学生就业管理等问题&#xff0c;对学生就业…

关于脉冲发生器,你知道多少?

01 引言 脉冲发生器&#xff08;Pulse Generator&#xff0c;PG&#xff09;是产生脉冲信号的专用仪器。它可以生成具有特定频率、幅值和脉冲宽度的脉冲信号&#xff0c;常用于各种科学、工程和技术领域中的实验、测试、通信和控制应用。 那么&#xff0c;对于一台脉冲发生器…

SDH传输分析仪有什么用? TFN D300S SDH传输分析仪详解

数字传输分析仪是数字通信中最重要、最基本的测试仪器&#xff0c;主要用于测试数字通信信号的传输质量&#xff0c;其主要测试参数包括误码、告警、开销、抖动和漂移等&#xff0c;其广泛应用于数字通信设备的研制、生产、维修和计量测试&#xff0c;还可应用于数字通信网络的…

自学VUE笔记

一、基础语法学习 1、Attribute 绑定 a、绑定单个属性&#xff1a;给这个div 增加id 属性 ​ <div v-bind:id"dynamicId"></div>简写&#xff1a; <div :id"dynamicId"></div> b、绑定多个属性值 data() {return {objectOf…

20年经典传承 | 性能圣典!火焰图发明者Brendan Gregg“神作”

20年20本经典畅销书 NO.9 豆瓣评分9.3 性能大师经典巨著 每一个学习性能优化/性能评估的工程师的必备手册 性能测量的水相当深&#xff0c;斯坦福大学的 John Ousterhout 教授在“Always Measure One Level Deeper”一文&#xff08;《ACM 通讯》杂志&#xff0c;2018 年第…