最小堆与最大堆测试代码

数据结构最小堆C++实现 #pragma once # include<iostream> using namespace std; int DefaultSize = 10; //定义最小堆默认存储数据的数目 //最小堆的头文件,包括类定义及接口的实现。 template <class T> class MinHeap { public: MinHeap(int sz = DefaultSize); //构造函数,建立空堆 ...... 阅读详情

最大堆

package lock;

import java.util.Arrays;

/**
 * @author LiFeng
 * @create 2019-10-16 上午 11:56
 * @describe
 */
public class MaxHeap {
	public static void main(String[] args) {
		int[] a = new int[]{49, 38, 65, 97, 76, 13, 27, 49, 55, 4};

		// 构建堆测试
		MakeMaxHeap(a, a.length);
		System.out.println(Arrays.toString(a));

		// 测试add
		a = Arrays.copyOf(a, a.length + 1);
		a[a.length - 1] = 80;
		fixAfterAdd(a);
		System.out.println(Arrays.toString(a));

		// 测试删除,堆的删除始终删除堆顶元素,为了方便重构,将最后一个元素放置堆顶进行一次下沉(这是最快的)
		int tmp = a[a.length - 1];
		a = Arrays.copyOf(a, a.length - 1);
		a[0] = tmp;
		fixAfterDel(a);
		System.out.println(Arrays.toString(a));

		// 测试堆排序
		sort(a);
		System.out.println(Arrays.toString(a));

	}

	// 添加元素后重新调整堆
	static void fixAfterAdd(int[] a) {
		int k = a.length - 1;
		while (k > 1) {
			int j = (k - 1) >> 1; // 找到当前节点的父节点坐标
			if (a[j] > a[k])
				break;
			int tmp = a[j];
			a[j] = a[k];
			a[k] = tmp;
			k = j;
		}
	}

	// 删除元素后重新调整堆
	static void fixAfterDel(int[] a) {
		MaxHeapFixdown(a, 0, a.length);
	}


	// 建立最大堆
	static void MakeMaxHeap(int a[], int n) {
		for (int i = n / 2 - 1; i >= 0; i--)
			MaxHeapFixdown(a, i, n);
	}

	/**
	 * 以向下的方式(如果发生了交换,则确保交换后的节点也满足堆结构)调整某个节点的堆结构
	 *
	 * @param i 节点下标
	 * @param n n-1表示向下调整到指定坐标
	 */
	static void MaxHeapFixdown(int a[], int i, int n) {
		int j, temp;

		temp = a[i];
		j = 2 * i + 1;
		while (j < n) {
			if (j + 1 < n && a[j + 1] > a[j]) //在左右孩子中找最小的
				j++;

			if (a[j] <= temp)
				break;

			a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点
			i = j;
			j = 2 * i + 1;
		}
		a[i] = temp;
	}


	// 堆排序
	static void sort(int[] a) {
		for (int length = a.length; length > 0; length--) {
			int temp = a[0];
			a[0] = a[length - 1];
			a[length - 1] = temp;
			MaxHeapFixdown(a, 0, length - 1);
		}
	}
}


最小堆

 

package lock;

import java.util.Arrays;

/**
 * @author LiFeng
 * @create 2019-10-16 上午 11:56
 * @describe
 */
public class MinHeap {
	public static void main(String[] args) {
		int[] a = new int[]{49, 38, 65, 97, 76, 13, 27, 49, 55, 4};

		// 构建堆测试
		MakeMinHeap(a, a.length);
		System.out.println(Arrays.toString(a));

		// 测试add
		a = Arrays.copyOf(a, a.length + 1);
		a[a.length - 1] = 32;
		fixAfterAdd(a);
		System.out.println(Arrays.toString(a));

		// 测试删除,堆的删除始终删除堆顶元素,为了方便重构,将最后一个元素放置堆顶进行一次下沉(这是最快的)
		int tmp = a[a.length - 1];
		a = Arrays.copyOf(a, a.length - 1);
		a[0] = tmp;
		fixAfterDel(a);
		System.out.println(Arrays.toString(a));

		// 测试堆排序
		sort(a);
		System.out.println(Arrays.toString(a));

	}

	// 添加元素后重新调整堆
	static void fixAfterAdd(int[] a) {
		int k = a.length - 1;
		while (k > 1) {
			int j = (k - 1) >> 1; // 找到当前节点的父节点坐标
			if (a[j] < a[k])
				break;
			int tmp = a[j];
			a[j] = a[k];
			a[k] = tmp;
			k = j;
		}
	}

	// 删除元素后重新调整堆
	static void fixAfterDel(int[] a) {
		MinHeapFixdown(a, 0, a.length);
	}


	// 建立最小堆
	static void MakeMinHeap(int a[], int n) {
		for (int i = n / 2 - 1; i >= 0; i--)
			MinHeapFixdown(a, i, n);
	}

	/**
	 * 以向下的方式(如果发生了交换,则确保交换后的节点也满足堆结构)调整某个节点的堆结构
	 *
	 * @param i 节点下标
	 * @param n n-1表示向下调整到指定坐标
	 */
	static void MinHeapFixdown(int a[], int i, int n) {
		int j, temp;

		temp = a[i];
		j = 2 * i + 1;
		while (j < n) {
			if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
				j++;

			if (a[j] >= temp)
				break;

			a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点
			i = j;
			j = 2 * i + 1;
		}
		a[i] = temp;
	}


	// 堆排序
	static void sort(int[] a) {
		for (int length = a.length; length > 0; length--) {
			int temp = a[0];
			a[0] = a[length - 1];
			a[length - 1] = temp;
			MinHeapFixdown(a, 0, length - 1);
		}
	}
}


 

最大最小堆的判定 最大最小堆的判定 堆类型的判定 ​ 就是判定堆是最大堆,最小堆还是不是堆。看到很多算法都是自上而下的,看起来不是特别简洁,有一点乱。 ​ 在这里记录一下我自己写的自下而上的堆判定函数。 const int notHeap = 0, maxHeap = 1, minHeap = -1; int cmp(int parent,int child) { if (parent > child)... 阅读详情

相关推荐

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

堆排,tips&&codes

1.添加元素总是从叶子添,删除元素总是

唧唧复歪歪 677

同济大学C++mooc第五、六讲参考答案

同济大学C++moooc第5、6讲 第五讲 第一题 随机产生10个30~100(包括30,100)的正整数,求它们的最大值、最小值、平均值,并显示整个数组的值和结果。 代码片. // #include<iostream> const int n = 10; using namespace std; int main() { int s[n],i,j,t,sum=0; for (i = 0; i < n; i++)

cjzui6666的博客 1万+

go语言实现最小堆并测试

作为go语言初学者,非常有必要多写写代码来熟悉go的语法和风格,本文是关于go语言实现最小堆,就不对最小堆进行赘述了,具体的构建原理可以参考我的这篇博客 下面直接上代码~ package main import "fmt" type Node struct { Value int } // 用于构建结构体切片为最小堆,需要调用down函数 func Init(nodes []Node) {...

Jundesky的博客 1026

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1527

保姆级教程:用Arduino+MPU6050自制寻北仪(附MEMS陀螺精度测试报告)

本文提供了一份详细的Arduino与MPU6050自制寻北仪的保姆级教程,包括硬件选型、卡尔曼滤波算法优化、地磁场补偿及真北计算等关键技术。通过实测数据展示了MEMS陀螺仪在民用领域的高精度性能,帮助读者低成本实现1°以内的寻北精度。

weixin_42522964的博客 366

Linux下测试堆的大小,管道的大小

测试堆的大小 测试管道的大小

Zong__Zong的博客 2063

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | 引入GCConv卷积改进YOLO26,含GCC3k2二次创新,能够捕捉更加丰富和复杂的特征信息,助力高效涨点

本文提出了一种基于GCConv模块的YOLO26目标检测模型改进方案。GCConv模块通过多路径结构增强特征学习能力,在训练阶段采用垂直多卷积和水平多路径配置,推理时重参数化为单一3x3卷积,显著提升推理速度而不损失性能。实验表明,该模块在复杂场景和多尺度目标检测任务中表现优异,特别适合资源受限的实时应用场景。文章详细介绍了GCConv的网络结构、核心代码实现、YAML配置文件修改方法,并提供了两种改进方案(GCConv和GCC3k2)的具体配置指导。

Ai缝合怪、助力小伙伴高效发论文 322

java 二叉堆_二叉堆的介绍和Java实现

一、堆和二叉堆堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序实现的。按照排列的顺序可以分为最大堆和最小堆,最大堆的特征是父节点一定大于(依据情况判断是大于等于还是严格大于,数据结构归根到底还是用来使用的)子节点的数据。同样,有最大堆就会有最小堆,最小堆的 父节点...

weixin_39564187的博客 431

华为OD机试2025C卷-双十一最大花费金额[100分](Java_Python3_C++_C语言_JsNode_Go)实现100%通过率

双十一最大花费金额 - 动态规划解法 摘要:本文介绍了华为OD机试中"双十一最大花费金额"问题的动态规划解法。该问题要求在给定N件商品价格和优惠券面额X的情况下,选择若干商品使总花费不超过X且尽可能大。核心解法采用布尔型动态规划数组,记录每个金额是否可被拼出。算法时间复杂度为O(N*X),空间复杂度为O(X)。通过倒序遍历避免重复选择同一商品,最后从X向下查找第一个可达金额作为答案。文中提供了C++和Java的实现代码,并解释了与经典0-1背包问题的关系。 关键点: 问题本质是0-1背包/子集和问题的变体

2503_91057718的博客 48

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2097

十大经典基础排序 - 堆排序

堆排序是一种基于堆的排序算法。堆是一个完全二叉树。堆中的每个节点都大于等于(或小于等于)它的子节点。根据堆的定义,我们可以将堆分为两种类型:最大堆和最小堆。最大堆的根节点是堆中最大的元素,最小堆的根节点是堆中最小的元素。堆排序的基本思想是:首先将待排序的序列构建成一个最大堆(或最小堆),然后将根节点与最后一个节点交换位置,并将剩余的节点重新构建成一个最大堆(或最小堆)。重复这个过程,直到整个序列有序。堆排序是一种高效的排序算法,它的时间复杂度为O(nlogn),并且不需要额外的存储空间。

shanxiyaofeng的博客 123

MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器

本示例展示了如何利用非线性模型预测控制(MPC)为四旋翼飞行器设计一个跟踪轨迹的控制器。

机器人控制与仿真应用 4435

优先级队列的实现

优先级队列是基于最大堆或者最小堆的,有很多的应用,比如任务调度,事件模拟之类的,下面我们来实现最大优先级队列(基于最大堆)和最小优先级队列(基于最小堆)。 最大优先级队列代码如下。在实际使用中,一般可以只保存一个用于比较的key和一个指向实际数据的指针在优先级队列中,下面的代码忽略了实际的数据,只考虑Key。 #ifndef _LARGESTPRIORITYQUEUE_ #define

thinking的专栏 944

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据流中的中位数

题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;vector&gt; #include &lt;functional&gt;...

weixin_39916039的博客 259

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【179】Java实现堆排序

本文讲解了堆排序的实现方式。并且把堆排序和冒泡排序放在一起比较了效率。

zhangchao19890805的专栏 468

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STL Heap

文章目录概述常见函数make_heappop_heappush_heapsort_heap测试代码测试结果 概述 ♦STL 并没有把heap作为一种容器组件,它是实现优先队列的助手。它的实现是依靠vector表现的完全二叉树。 ♦STL中默认是最大堆,但是用户利用自定义的compare_fuction函数实现最小堆。 ♦heap是一个类属算法,在头文件#include< algorithm&...

weixin_43725617的博客 228

【剑指Offer刷题系列】数据流中的中位数

本题要求设计一个数据结构,能够高效地从数据流中添加数字并随时返回中位数。由于数据流可能非常大(最多50000次操作),我们需要一种高效的方法来维护数据的中位数。中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。该方法在实际应用中广泛使用,尤其适用于需要实时统计中位数的数据流场景,如在线统计、实时监控等。的方法,我们能够高效地设计一个支持实时添加数字和查找中位数的数据结构。以下是针对上述方法的测试代码,使用。

weixin_44329069的博客 1388

堆排序问题

堆,本质上是一个完全二叉树,可以用数组来表示,这样非常的方便。最大堆:从数组的第一号开始排,a[0]为空,方便计算。那么ai>=a2i &&ai>=a(2i+1),那么就是最大堆; 最小堆:从数组的第一号开始排,a[0]为空,方便计算。那么ai<=a2i &&ai<=a(2i+1),那么就是最小堆。我写了一个堆排序的代码。现在贴出来供大家参考,有错误的地方请大家告诉我,我马上修改: 头文件:``

Fukui_YB_yb的博客 506

剑指offer-数据流中的中位数

58.题目内容: 代码及思路: #include<functional> #include<queue> priority_queue<double> big_queue; //最大堆 priority_queue<double, vector<double>, greater<double> > small_que...

larklili的博客 126

【算法系列 | 6】深入解析排序算法之——堆排序

堆排序(Heap Sort)是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆),重复以上步骤直到所有元素都有序。

颜淡慕潇 1万+

C++的 STL堆 实现获取中位数

前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 中位数: 一组数排序后,如果元素个数如下 奇数个数n:(int) n/2 的数 偶数个数n: (int) n/2 和(int) n/2 +1的平均数 同样此时想要获取一组数列中的中位数,且同样使用时间复...

天行健,地势坤 2274

数据结构-堆的基本操作

堆(heap)也被称为优先队列(priority queue)。队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。而堆也是一样,在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。这个优先顺序可以是元素的大小或者其他规则。如图一所示就是一个堆,堆优先顺序就是大的元素排在前面,小的元素排在后面,这样得到的堆称为最大堆。最大堆中...

zgege的博客 600

数据结构练手05 关于堆的up策略和down策略实现

堆,是一个相当重要的数据结构,它是优先队列,堆排序,Dijkstra等算法的实现保证! 堆的主要特性是: 1、根结点是最大/最小的,而这个主要的区别,就是实现比较操作时是less or greater, 因此可以使用纯虚化 比较接口,把实现放到子类。 附: STL中采用的是模板默认参数的方法实现。 2、需要两个表示大小的变量来标定堆or数组的大小。因为pop操作因让堆的有效长度变小,而数组的...

weixin_34138056的博客 323
上一篇: 白话经典算法系列之七 堆与堆排序
下一篇: 从源码角度学习Timer定时器
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值