#include "heap.h"
#include <malloc.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
void Swap(HPDataType* pLeft, HPDataType* pRight){
HPDataType temp = *pLeft;
*pLeft = *pRight;
*pRight = temp;
}
void AdjustDown(HPDataType* array, int size, int parent){
//默认标记左孩子,因为完全二叉树可以没有右孩子,不能没有左孩子
int child = parent * 2 + 1;
while(child < size){
//找双亲孩子中较小的孩子
if (child+1<size && array[child + 1] < array[child]){
child += 1;
}
if (array[child] < array[parent]){
Swap(&array[child], &array[parent]);
parent = child;
child = parent * 2 + 1;
}
else{
return;
}
}
}
void InitHeap(Heap* hp, HPDataType* array, int size){
assert(hp);
hp->array = (HPDataType*)malloc(sizeof(HPDataType) * size); //给空间
//判空
if (hp->array == NULL){
assert(0);
return;
}
hp->capacity = size;//最多的容量
//放入元素
for (int i = 0; i < size; ++i){
hp->array[i] = array[i];
}
hp->size = size;
//将完全二叉树调整让其满足堆的性质
//找完全二叉树中倒数第一个非叶子节点
int root = ((size - 2) >> 1);
for (; root >= 0; --root){
AdjustDown(array, size, root);
}
}
void InsertHeadp(Heap* hp, HPDataType data){
assert(hp);
}
void EraseHeap(Heap* hp){
if (HeadEmpty(hp)){
return;
}
//删除根节点元素
Swap(&hp->array, &hp->array[hp->size]);
hp->size -= 1;
AdjustDown(hp->array, hp->size, 0);
}
int HeadSize(Heap* hp){
assert(hp);
return hp->size;
}
int HeadEmpty(Heap* hp);
HPDataType HeapTop(Heap* hp);
void DestoryHeap(Heap* hp){
assert(hp);
if (hp->array){
free(hp->array);
hp->capacity = 0;
hp->size = 0;
}
}
void TestHeap(){
Heap hp;
int a[] = { 2, 3, 8, 0, 9, 1, 7, 4, 6, 5 };
InitHeap(&hp, a, sizeof(a) / sizeof(a[0]));
printf("%d", HeadSize(&hp));
DestoryHeap(&hp);
}
int main(){
TestHeap();
system("pause");
return 0;
}
相关推荐
光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导
引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.
5种常见排序方法深度剖析
# include # include using namespace std; size_t *InsertSort1(size_t *array, size_t size)//直接插入排序双循环写法 { assert(array); for (int i = 1; i { size_t temp = array[i]; int j = i - 1; for (; j >=
VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)
本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。
堆的实现详解
堆的实现以及top-k问题
ADS交叉耦合振荡器VCO仿真
本文主要参考视频中如何使用进行ADS交叉耦合振荡器仿真和分析,由于视频中有诸多错误和视频清晰度较低,虽然视频博主及时改正,为了节省学习时间,可以直接参考本文。
Halcon相机标定实战:从参数设置到精度优化全解析
本文详细解析Halcon相机标定的全流程,从基础概念到实战技巧,涵盖参数设置、精度优化及常见问题解决方案。通过实际案例和代码示例,帮助读者掌握工业视觉项目中相机标定的关键技术,提升测量精度和系统稳定性。
堆的实现以及利用堆进行排序
堆是一种特殊的完全二叉树,分为最大堆和最小堆。在最小堆中,父节点的值总是小于或等于其子节点的值。这种特性使得堆的根节点始终是所有节点中的最小值,非常适合实现优先队列。堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值;堆总是⼀棵完全⼆叉树。⼆叉树性质对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有结点从0 开始编号,则对于序号为 i 的结点有:若 i>0 , i 位置结点的双亲序号: (i-1)/2;i=0 , i 为根结点编号,⽆双亲结点。
1020空心杯电机驱动设计与ESP32实战
空心杯电机是一种高动态响应的直流微特电机,其驱动本质是解决电感负载下的大di/dt启动、反电动势耦合与电流纹波抑制问题。核心原理在于建立包含内阻、电感和反电动势的等效电路模型,并据此匹配开关器件、PWM参数与采样闭环。技术价值体现在小体积下实现毫秒级响应、低噪声(>30kHz)、高精度电流保护(±50mA)及热鲁棒性。典型应用于微型航模、手持云台与精密执行器等对功率密度和动态性能敏感的嵌入式系统。本文以1020规格空心杯电机为对象,基于ESP32平台完成从MOSFET选型、32kHz硬件PWM生成到INA2
堆的实现
堆 的讲解与实现
绑定压力的计算方法
压强的公式为P=F/S,其中P为ACF要求的本压压强范围,S为受压面积,F为本压压头施加的力。绑定参数需要按线体按压头进行DOE确认,并使用DOE确认好的参数按压头重新绑定标识好送ACF厂商实测固化率、粒子变形的情况,避免绑定参数导致的异常,在绑定参数的设定过程中温度和时间可以使用仪器实测但绑定的压力则需要换算。工程上绑定压力换算的原则是:1、FPC属于柔性物料,柔性物料的受压面积按FPC绑定的受压面积=FPC绑定的长度。一、工程上FOG FPC本压压力换算(柔性材料以挤压的接触面积=受力面积)F=P。
ANSYS Workbench接触分析实战:从算法选择到收敛难题破解
本文深入解析ANSYS Workbench接触分析的核心技术与实战技巧,涵盖四大接触算法选择、收敛难题破解秘籍及典型场景参数设置。通过实际案例演示如何优化接触刚度、pinball区域和非对称行为等关键参数,帮助工程师有效解决结构非线性问题,提升仿真效率和精度。
【数据结构】堆的实现以及建堆算法和堆排序
哈喽,各位小伙伴大家好!上期给大家讲了树,二叉树以及堆。今天带着大家实现堆这个数据结构,以及堆排序。话不多说,咱们进入正题!向大厂冲锋!
搭建ROS小车真的难吗?
搭建ROS小车真的难吗?不难 1.引言 本着为大家谋福利的心态,根据自己以往的开发经验,打算写一个从零开始制作一个可以实现地图构建和导航的ROS小车。目前某宝上面有很多现成产品,但是我个人认为,一个好的移动机器人开发工程师,应该对机器人的整个流程都能具备维护的能力,然后再深入研究其中一个方向即可。看到网上很少有整个系列的开发教程,看到同学们大多东拼西凑,浪费了不少时间。我就想着利用空余时间,将我本人的开发过程输出给大家。有基础理论、有实际工程代码、有丰富的学习资料,尽最大努力帮大家进入移动机器人的大门。 国
堆——C语言实现
堆是一种数据结构,他的特点在于形成某种优先的结构。在计算机经常用到,比如优先队列,或者是优先进程管理。 堆(也叫二叉堆)的性质: 1、任何一个节点,都不大于他的父亲节点。 2、必须是一颗完全二叉树 比如下面: 我们用一个很经典的堆的实现方法:用数组实现堆。 注意,这里实现的叫最大堆,就是把最大元素放在顶端,最小堆的实现方法相同。 如图,我们给一个堆的每个元素编号: 这...
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
堆的数组实现
用数组实现堆
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
堆的实现(堆的插入、堆的删除等)超级全
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
堆的实现(偷懒版)
在上期内容介绍了二叉树、还简单提了一下堆的概念和大堆、小堆。回顾一下堆是首先是完全二叉树,因为是完全二叉树所以使用数组储存比较合理。本节重点堆的向上、向下调整算法的代码实现 和 复杂度计算。
【堆】堆的实现(Java)
今天学习堆这种数据结构。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: 堆中某个结点的值总是不大于或不小于其父结点的值; 堆总是一棵完全二叉树。 将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。 1.用优先队列实现 一般我们直接用优先队列实现堆: // 小顶堆,以 Integer 为例 PriorityQueue<Integer> pq = new PriorityQueue<>(); // 大顶堆 PriorityQueue<Int
【数据结构】堆(堆的实现 堆向下调整算法 堆的创建 堆的插入 堆的删除 堆的代码实现 堆的应用)
给出一个数组,逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们把它构建成一个堆。删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。建堆和堆删除中都用到了向下调整,因此必须掌握了向下调整。先插入一个数组的尾上,再进行向上调整算法,直到满足堆。开始调整,一直调整到根节点的树,就可以调整成堆。1.将堆顶元素与堆中追后一个元素进行交换。堆是一个完全二叉树:分为小根堆和大根堆。大根堆:任何一个节点的值都>=孩子的值。前提:左右子树必须是一个堆,才能调整。
java 堆实现
java 堆实现 代码 public static void buildheap(int[] a , int heaplength) { for(int i = a.length/2-1; i >= 0; i–) { heapify(a, i, heaplength); } } //小顶堆 public static void heapify(int a[], int i, int hea...
数据结构-堆的实现
堆的实现 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); //堆的向
用数组实现堆
一、简单了解堆 如果有一个关键码的集合k = {k0,k1,k2,...,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:ki <= k21+1 且 ki <= k2i+2(ki >= k2i+1 且 ki >= k2i+2) i = 0,1,2...,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆...
堆的实现算法
堆的实现算法 代码: #include #include #include <Windows.h> using namespace std; #define DEFAULT_CAPACITY 128 //堆的生成 typedef struct _Heap { int *arr; int size; int acpacity; }_Heap; //堆的接口 bool heapInit...
数据结构——堆的实现
堆的创建,插入,删除,还有YOP-K问题
< 数据结构 > 堆的实现
目录 1、前言 堆的概念 堆的结构 2、堆的实现 2.1、准备工作 创建堆结构 初始化堆 堆的打印 堆的销毁 建堆时间复杂度 2.2、堆调整 堆的交换 堆向上调整算法 堆向下调整算法 2.3、核心功能 堆的插入 堆的删除 ...
最小堆java实现极其思想,最小堆的java实现
//从大牛那里转来的最小堆的动态添加与删除,以后好好看public class Node {/** * 堆结点 * 节点数据类型为:int */private int iDate;public Node(int iDate) {super();this.iDate = iDate;}public int getiDate() {return iDate;}public void setiDate(...
2万+




被折叠的 条评论
为什么被折叠?



