堆的结构及实现

【数据结构】模拟实现 堆 堆数据结构是一种数组对象,它可以被看作一颗完全二叉树的结构(数组是完全二叉树),堆是一种静态结构。堆分为最大堆和最小堆。最大堆:每个父结点都大于孩子结点。最小堆:每个父结点都小于孩子结点。堆的优势:效率高,可以找最大数最小数,增删的时间复杂度为lgN怎么找最后一个叶子结点?找到最后一个叶子结点(左孩子为空就是叶子结点),由于堆是静态结构,所以我们要通过计算下标的方法找,计算它的孩子是否超出了数组范围。 阅读详情

1.知识储备:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.堆的API设计:
在这里插入图片描述
上浮算法图解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下沉算法图解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3代码实现:

package heap;

public class Heap<T extends Comparable<T>>{
    //存储堆中的元素,用数组实现
	private T[] items;
	//记录堆中元素的个数
	private int N;
	public Heap(int capacity) {
		// TODO Auto-generated constructor stub
		this.items=(T[]) new Comparable[capacity+1];
		this.N=0;
	}
	
	//判断堆中索引i处的元素是否小于j处的元素
	private boolean less(int i,int j){
		return items[i].compareTo(items[j])<0;
	}
	
	//交换堆中i处索引和j处索引的值
	private void exch(int i,int j){
		T item =items[i];
		 items[i]=items[j];
		 items[j]=item;
	}
	
	//往堆中插入一个元素
	public void insert(T t){
		items[++N]=t;
		swim(N); 
	}
	
	//使用上浮算法,使得索引k处的元素再堆中处于一个正确的位置
	private void swim(int k){
		//通过循环不断地比较当前节点的值与其父节点的值,如果发现父节点的值比当前节点的值小,则交换位置
		//while循环的结束条件为k>1,因为ke最小可以上浮到根节点的左子树位置,当k<=1就不用比较了
		while(k>1){
			//比较当前节点和其父节点
			//如果其父节点比当前节点的值要小
			if(less(k/2,k)){    
				//交换他们两的位置
				exch(k/2,k);   
				//变换k的值,以便继续比较
				k=k/2;
			}
			//这里要注意一个bug,k/2的值不小于k的值,那么由于k的值无法改变,程序就会陷入死循环,所以这里要设置一下,不满足条件则退出循环
			else{
				break;
			}
		}
	}
	
	//使用下沉算法,使得索引k处的元素再堆中处于一个正确的位置
	private void sink(int k){
		//通过循环不断对比,当前k节点和其左子节点2k以及其右子节点2k+1元素中的较大值进行比较,如果当前节点小,则交换位置
		//while循环的条件为2*k<=N,这样才能保证当前节点有左子节点
		while(2*k<=N){
			//获取当前节点的左右子节点中的较大值
			//记录较大值所在的索引
			int max;
			//如果当前节点存再右子节点
			if(2*k+1<=N){
				//比较左右子节点的值
				//如果左子节点小于右子节点
				if(less(2*k,2*k+1)){
					//较大值为右子节点索引
					max=2*k+1;
				}else{
					max=2*k;
				}
			}
			//如果不存在右子节点
			else{
				//较大值直接等于左子节点
				max=2*k;
			}
			//比较当前节点和较大值的节点的值
			//如果当前节点的值不小于它子节点的值,直接结束循环即可
			if(!less(k,max)){
				break;
			}
			//交换索引k处和索引max处的值
			else{
				exch(k,max);
				//变换k的值,继续比较
				k=max; 
			}
		}
	}
	
	//删除堆中的最大元素,并返回这个元素
	public T delMax(){
		T max=items[1];
		//交换索引1处元素和最大索引处元素的值,让完全二叉树最右侧的元素变为临时的根节点
		exch(1,N);
		//最大索引处的元素删除掉
		items[N]=null;
		//元素个数-1
		N-=1;
		//通过下沉调整堆,让堆重新有序
		sink(1);
		return max;
	}
	
	//提供遍历方法
	public  void traversal(){
		for(int i=1;i<items.length;i++){
			System.out.print(items[i]+"->");
		}
			System.out.println();
	}
}

4.测试案例:

package heap;

public class heapTest1 {
    public static void main(String[] args) {
		//创建堆对象
    	Heap<String> heap1 =new Heap<String>(10);
    	//往堆中插入字符串数据
    	heap1.insert("D");
    	heap1.insert("C");
    	heap1.insert("A");
    	heap1.insert("F");
    	heap1.insert("B");
    	heap1.insert("G");
    	heap1.insert("E");
    	heap1.insert("J");
    	heap1.insert("H");
    	heap1.insert("I");
    
    	//通过循环从堆中删除元素,如果程序写的没有问题,那么每次删除的元素索引为一的元素,而且是元素中值最大的
    
    	//遍历
    	heap1.traversal();
    	/*
    	String result=null;
    	while((result=heap1.delMax())!=null){
    		System.out.print(result+"->");
    	}
    	System.out.println("\n-----------------------------------------------------------------------");
    	*/
	}
}


6.测试结果
在这里插入图片描述

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析) 本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。 阅读详情

相关推荐

一文读懂资管系统里的“清算路径”:钱和券的“导航地图”

简单来说,清算路径就是给每一笔交易预设好的“导航路线”。钱从哪个银行账户出?通过哪家证券公司去买?用哪个股东账户去登记?买回来的股票记在谁的名下?“清算路径”就是把这一连串问题的答案提前配置好。它连接了银行托管户(钱的源头)、券商(交易的中介)和交易所(买卖的市场)。没有配好这条路,交易就无法闭环。清算路径是金融基础设施的缩影。资金如何安全地从银行流向市场;资产如何合法地归属到产品名下;交易数据如何在不同系统间流转。它是资管系统能够日复一日、准确无误地处理亿万级交易的基石。

m0_37607945的博客 235

7. 堆的简单学习

堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵。

weixin_43830137的博客 284

人工智能情感分析实战:文本情绪识别

人工智能情感分析,特别是文本情绪识别,已成为理解和处理人类情感信息的重要工具。通过数据预处理、特征提取、模型训练与评估等步骤,我们可以有效地从文本数据中提取情感信息,为各种应用场景提供有价值的洞察。随着技术的不断进步和创新,情感分析的应用前景将更加广阔,为我们的生活和工作带来更多便利和机遇。

shejizuopin的博客 1094

与堆有关的API

进程初始化的时候,系统会在进程的地址空间中创建一个堆。这个堆被称为进程的默认堆。 除了进程的默认堆,我们可以在进程的地址空间中创建额外的堆。由于以下原因,我们可能希望在应用程序中创建额外的堆: • 对组件进行保护 • 更有效地内存管理 • 局部访问 • 避免线程同步的开销 • 快速释放 HeapCreate 创建额外的堆 HANDLE WINAPI HeapCreate( In DWORD flOptions, In SIZE_T dwInitialSize, In SIZE_T dwMaximumSiz

weixin_45239587的博客 669

Android投屏开发实战:手把手教你用Miracast实现Sink端功能(附完整代码)

本文是一份Android投屏Sink端开发的实战指南,详细讲解了如何利用Miracast协议和Wi-Fi P2P技术,从零构建一个功能完整的屏幕接收器。内容涵盖环境搭建、通过反射启用WFD Sink模式、RTSP协议协商、RTP流接收与解析,以及最终使用IjkPlayer进行音视频解码播放的全过程,并附有核心代码示例。

cherry的博客 878

深度学习之Pytorch---本人踩过的坑(报错总结)第十篇

深度学习之Pytorch安装时遇到的问题—本人踩过的坑(报错总结) 报错一:pip install torchvision 出现“由于目标计算机积极拒绝,无法连接”的问题 解决方案:找到自己浏览器的工具或选项,我的是火狐,具体解决方案如下图 然后找到桌面左下角,点击搜索internet,然后点击internet选项 最后回到Anaconda Prompt命令行输入pip install...

qq_41570307的博客 1914

二叉堆的设计javaAPI

//二叉堆 public class MaxPQ <Key extends Comparable<Key>> { // 存储元素的数组 private Key[] pq; // 当前 Priority Queue 中的元素个数 private int N = 0; public MaxPQ(int cap) { // 索引 0 不用,所以多分配一个空间 pq = (Key[]) new Comp

qq_36382679的博客 206

清华开源GPGPU“承影Ventus”初体验:用RISC-V RVV指令集跑通第一个OpenCL程序

本文详细介绍了清华大学开源GPGPU“承影Ventus”的开发实践,展示了如何基于RISC-V RVV指令集运行首个OpenCL程序。从环境配置、内核开发到性能优化,全面解析了这一创新架构的开发流程,为开发者提供了在RISC-V生态中进行通用GPU计算的实用指南。

weixin_30415113的博客 489

windows堆管理API

HeapCreate, HeapDestroy, HeapAlloc, HeapFree 堆内存管理工具。

馋嘴猪没胃口 1439

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1096

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2016

Window API (三)堆管理操作

Windows 系统中,每个进程都有自己的堆,每个进程的堆的数量也有所不同。Windows系统中所谓的“堆”(Heap)并不是内存块,而是一种用于内存管理的对象,也是一种内存组织的形式。进程可以从属于自己的堆上分配内存和释放内存。      堆的句柄惟一标识了一个堆。在堆上分配内容前,首先需要获得所要进行分配的堆的句柄,获得堆的句柄有两种方式:一种是获取在进程中时已经创建好的堆,二是进程自己再创

阿修罗道 2654

Python爬虫抓取淘宝商品详情页信息:从入门到高级技术应用

通过本篇博客,我们了解了如何使用Python爬虫抓取淘宝商品详情页的信息,如何使用requests和Selenium抓取静态和动态内容,如何应对淘宝的反爬虫机制,如何将抓取的数据保存到CSV文件等。随着爬虫技术的不断发展,开发者可以根据需要选择合适的工具和技术,如使用分布式爬虫框架提高抓取效率,或者利用OCR技术处理验证码等问题。在进行淘宝爬虫时,需要注意遵循相关法律法规和平台的爬虫政策,避免对平台造成过度的负担或侵犯其合法权益。

2201_76125261的博客 460

< 数据结构 > 堆的实现

目录 1、前言 堆的概念 堆的结构 2、堆的实现 2.1、准备工作 创建堆结构 初始化堆 堆的打印 堆的销毁 建堆时间复杂度 2.2、堆调整 堆的交换 堆向上调整算法 堆向下调整算法 2.3、核心功能 堆的插入 堆的删除 ...

bit_zyx的博客 2812

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【数据结构】堆的实现

目录 堆的概念及结构 堆的逻辑结构与存储结构 堆的实现 堆的插入 堆的创建 堆的删除 获取堆顶的数据 堆的数据个数 堆的判空 堆的销毁 实现堆的全部代码 测试用例 堆的概念及结构 如果有一个关键码的集合K = { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: Ki <= K(2*i+1) 且 Ki <= K(2*i+2) (或Ki>=K(2*i+1) 且 Ki >= K(2*i+2)).

waywt1的博客 1925

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【数据结构】堆的概念、结构、模拟实现以及应用

本篇我们来介绍一下数据结构中的堆。

2402_82757055的博客 2004

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构-堆的实现

堆的实现 Heap.h 堆的管理及接口 #include<stdio.h> #include<stdlib.h> #include<assert.h> typedef int HPDataType; typedef struct Heap { HPDataType* a; int size; int capacity; }Heap; //堆的向下调整算法 void AdjustDown(HPDataType* a, int n, int root); //堆的向

HanMeng的博客 7949

数据结构——堆的实现

堆的创建,插入,删除,还有YOP-K问题

plj521的博客 1381

【数据结构】堆的实现以及建堆算法和堆排序

哈喽,各位小伙伴大家好!上期给大家讲了树,二叉树以及堆。今天带着大家实现堆这个数据结构,以及堆排序。话不多说,咱们进入正题!向大厂冲锋!

大白的编程日记. 2017

【数据结构】实现堆

数据插入完成后,我们还要保证这是一个小堆,所以要对比这个数据和它的双亲结点的值:如果它的值要大于双亲结点的值,那位置就不要动;如果它的值要小于双亲结点的值,为了让这个堆还是小堆,我们要将它和双亲结点互换位置,直到它的值要大于双亲结点的值或者它已经是根节点。的顺序存储方式存储在一个一维数组中,并满足:任意一个双亲结点的值=孩子节点的值),则称为。因为函数的实参是HP类型变量的地址,不可能为空,所以对它断言,下面的接口同理。如果有一个关键码的集合K,把它的所有元素按。

qq_75000174的博客 1240

【数据结构】二叉树之堆的实现

在上一期的文章中我们学习了一些二叉树的知识,也了解了堆的概念。堆是一颗完全二叉树,分为大堆和小堆,今天我们将实现堆的各种功能。

小王又困了的博客 1454

数据结构——最小堆的实现总结

堆的实用性 编程过程中,时常会遇到一种模型,我们收集到一些数据,并对其处理,但是我们需要首先处理这些数据中具有最小关键码或者最大关键码(Key:可以是根据数据的先后顺序或重要程度等给数据编的号码)的数据。我们希望有一种数据结构能够支持插入操作并能方便的从中取出具有最小或最大关键码的记录,这样的数据结构即为优先级队列,优先级队里的实现方式有多种,其中最高效的一种便是堆(heap)。堆的种类 堆有最

razorEdge的博客 1万+

数据结构堆的特性及代码实现一个堆

数据结构堆的特性及代码实现一个堆 1.堆的概念 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,...

a_hang_szz的博客 651

【数据结构】二叉树——堆如何实现

二叉树的顺序结构;堆的概念及结构;堆向下调整的算法;堆的代码实现;堆排序;TOP-K问题

m0_57388581的博客 3887

【堆】数据结构堆的实现(万字详解)

数据结构堆的详解

m0_56069910的博客 783

数据结构:堆的实现

堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。(更详细的定义->

Another_Shi的博客 1032
上一篇: 折纸问题(利用树的模型解决)
下一篇: 堆排序的实现
将来的王
博客等级 码龄7年 2粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值