堆的基本操作实现

C++实现堆的基本操作 #pragma once #include<iostream> using namespace std; #include<vector> //小堆 template<class T> class Heap { public: Heap() {} Heap(const T* array, int size) { ... 阅读详情

一、堆的概念

        堆数据结构是一种数据对象,它可以被视为一棵完全二叉树结构。

        堆的二叉树存储是:

                最大堆:每个父节点都大于其孩子结点;

                最小堆:每个父节点都小于其孩子结点。

二、堆的实现

1.堆的结构体

typedef struct Heap { 
    HeapType data[HeapMaxSize]; 
    size_t size; 
    Compare cmp; 
} Heap; 

2.堆的初始化

        堆的初始化就是对结构体中的 size 和 cmp函数指针进行初始化,size =0,cmp有俩种选项可供选择:大堆(Greater)和小堆(Less)。

int Less(HeapType a,HeapType b){
    return a<b?1:0;
}
int Greater(HeapType a,HeapType b){
    return a>b?1:0;
}
//堆的初始化
void HeapInit(Heap* heap, Compare cmp){
    if(heap == NULL){
        //非法输入
        return;
    }
    heap->size = 0;
    heap->cmp = cmp;
    return;
}

3.打印堆与元素的交换

    堆的打印:为了清晰的对堆元素进行查看;

    元素的交换:每次对堆操作,会影响堆的排列顺序,所以应该调用交换元素的函数的方式对堆进行调整,使其满足对于堆的结构(调用元素交换函数时,应该传入 元素的地址(传置))。

//层序遍历堆
void print_Heap(Heap heap,char* msg){
    printf("\n*******%s***********\n",msg);
    int i = 0;
    for(;i<heap.size;++i){
        printf("%d ",heap.data[i]);
    }
    printf("\n");
    return;
}
//,交换函数 
void swap(int * a,int * b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
    return;
}

4.堆的插入实现

对堆进行插入操作可由以下步骤实现:

i>判断堆是否为空堆

ii>堆为空,直接插入,,堆不为空,将带插入值先插至结构体数组的size处,并将size进行++操作

iii>将size-1视为cur,(cur-1)/2视为parent,并进入 while(cur>=0)循环,若cur处的值与parent处的值满足堆结构,直接退出,否则进行交换,然后使cur = parent, parent = (cur-1)/2;

iv>循环结束,变换后的堆又满足了堆的结构

//往堆里插入元素
void HeapInsert(Heap* heap, HeapType value){
    //1.判断是否为非法输入
    if(heap == NULL){
        //非法输入
        return ;
    }
    //2.判断堆是否为空
    if(heap->size == 0){
        //堆位空
        heap->data[heap->size] = value;
    }else{
        //堆不为空
        heap->data[heap->size] = value;
        int cur = heap->size;
        int parent = ( cur - 1 )/2;
        while(parent >= 0){
            if ( heap->cmp(heap->data[cur], heap->data[parent]) ){
                swap(&heap->data[cur],&heap->data[parent]);
                cur = parent;
                parent = (cur - 1)/2;
            }else{
                break;
            }
        }
    }
    ++heap->size;
    return;
}

5.取堆顶元素

//取堆顶元素
int HeapRoot(Heap* heap, HeapType* value){
    //1.判断是否为非法输入
    if(heap == NULL){
        //非法输入
        return 0;
    }
    //2.判断堆是否为空,空堆返回0,否则返回1
    if(heap->size == 0){
        //空堆 
        return 0;
    }else{
        //非空
        *value = heap->data[0];
        return 1;
    }
}

6.删除堆顶元素

        首先判断是否为空堆,如果为空堆直接返回,否则将堆首元素与堆末元素进行交换,对size进行--操作,然后调整堆的结构,使变化后的堆重新满足堆的结构。

//删除堆顶元素
void HeapErase(Heap* heap){
    //1.判断是否为非法输入
    if(heap == NULL){
        //非法输入
        return;
    }
    //2.判断堆是否为空
    if(heap->size == 0){
        //堆为空
        return;
    }else{
        //非空
        swap(&heap->data[0],&heap->data[heap->size-1]);
        --heap->size;
        int cur = 0;
        int child = 2*cur +1;
        while(child < heap->size){
            //当前结点右子树,,
            //判断该结点是否具有右子树
            if(child+1<heap->size){
                //带结点具有右子树
                //进行左右子树判断,挑选满足规定的值
                if(heap->cmp(heap->data[child],heap->data[child+1]) == 0){
                    //child不满足规定
                     ++child;
                     if(heap->cmp(heap->data[cur],heap->data[child])== 0){
                         swap(&heap->data[cur],&heap->data[child]);
                         cur = child;
                         child = ( cur-1 ) /2;
                     }else{
                         return;
                     }
                }else{
                    //child满足规定
                     if(heap->cmp(heap->data[cur],heap->data[child])== 0){
                         swap(&heap->data[cur],&heap->data[child]);
                         cur = child;
                         child = 2*cur+1;
                     }else{
                         return;
                     }
                }
            }else{
                //cur无右子树
                if(heap->cmp(heap->data[cur],heap->data[child])== 0){
                    swap(&heap->data[cur],&heap->data[child]);
                    cur = child;
                    child = ( cur-1 ) /2;
                }else{
                    return;
                }
            }
        }
    }
    return;
}

7.堆的销毁

堆的销毁,可以直接将堆结构体中的size置为0就好,此处进行了大规模的处理,是为了方便使用堆对数组进行排序。

//堆的销毁
void HeapDestroy(Heap* heap){
    //1.判断是否为非法输入
    if(heap == NULL){
        //非法输入
        return;
    }
    //2.判断是否为空堆
    if(heap->size == 0){
        //为空
        return;
    }else{
        //非空
        while(heap->size){
            HeapErase(heap);
        }
        return;
    }
}

8.堆排序

堆排序实质上是为了解决数组的排序,如果要将数组进行升序排列,就采用大堆实现,如果要将数组进行降序排列,就采用小堆实现。

//堆排序函数
void HeapSort(HeapType array[], size_t size){
    int i = 0;
    Heap heap ;
    HeapInit(&heap,Greater);
    for(;i<size;i++){
        HeapInsert(&heap,array[i]);
    }
    HeapDestroy(&heap);
    Heap new_heap = heap;
    new_heap.size = size;
    print_Heap(new_heap,"HeapSord");
    return;
}

9.以上函数的检测代码

//堆排序的检测函数
void textHeapSort(){
    int array[] = {1,2,3,4};
    HeapSort(array,sizeof(array)/sizeof(array[0]));
    return;
    
}
//堆销毁的检测函数
void textHeapDestroy(){
    Heap heap ;
    HeapInit(&heap,Greater);
    HeapInsert(&heap,1);
    HeapInsert(&heap,2);
    HeapInsert(&heap,3);
    HeapInsert(&heap,4);
    int size = heap.size;
    HeapDestroy(&heap);
    print_Heap(heap,"堆删除");
    return;
}
//删除堆顶元素的检测函数
void textHeapErase(){
    Heap heap ;
    HeapInit(&heap,Greater);
    HeapInsert(&heap,1);
    HeapInsert(&heap,2);
    HeapInsert(&heap,3);
    HeapInsert(&heap,4);
    HeapErase(&heap);
    print_Heap(heap,"删除堆顶元素");
    return;
}
//取堆顶元素的检测函数
void textHeapRoot(){
    Heap heap ;
    HeapInit(&heap,Greater);
    HeapInsert(&heap,1);
    HeapInsert(&heap,2);
    HeapInsert(&heap,3);
    HeapInsert(&heap,4);
    HeapType value;
    int ret = HeapRoot(&heap,&value);
    printf("\n*******取堆顶元素***********\n");
    printf("ret except:1  actual:%d\n",ret);
    printf("value except:4   actual:%d\n",value);
}
//堆插入的检测函数
void textHeapInsert(){
    Heap heap ;
    HeapInit(&heap,Greater);
    HeapInsert(&heap,1);
    HeapInsert(&heap,2);
    HeapInsert(&heap,3);
    HeapInsert(&heap,4);
    print_Heap(heap,"堆插入四个元素");
    return;
}
//堆初始化的检测函数 
void textHeapInit(){
    Heap heap ;
    HeapInit(&heap ,Greater);
    print_Heap(heap,"对堆进行初始化");
    return;
}

10.主函数

//主函数
int main(){
    textHeapInit();//堆初始化的检测函数
    textHeapInsert();//堆插入一个元素
    textHeapRoot();//取堆顶元素的检测函数
    textHeapErase();//删除堆顶元素的检测函数
    textHeapDestroy();//堆删除的检测函数
    textHeapSort();//
    return 0;
}
11.检测结果
*******对堆进行初始化***********


*******堆插入四个元素***********
4 3 2 1 

*******取堆顶元素***********
ret except:1  actual:1
value except:4   actual:4

*******删除堆顶元素***********
3 1 2 

*******堆删除***********


*******HeapSord***********
1 2 3 4 

生信人的一天~HIFI数据+HIC数据组装基因组 HIFI+HIC数据组装基因组! 阅读详情

相关推荐

VLA强化学习训练:π0到π0.5的技术优化与实现

视觉语言动作模型(VLA)作为多模态强化学习的重要分支,通过融合视觉、语言和环境状态数据实现智能决策。其核心技术在于多模态特征融合与动作空间设计,其中PPO算法因其出色的训练稳定性成为首选方案。在工程实践中,延迟补偿机制和课程学习设计能显著提升模型性能,如在四足机器人项目中使避障成功率提升47%。针对实际部署中的性能下降问题,需要特别关注硬件量化参数和控制频率一致性等关键因素。本文通过π0与π0.5版本的对比实验,详细解析了VLA模型在机械臂控制等具身智能场景中的优化路径。

weixin_29041767的博客 246

堆的基本操作及应用

1. 堆的基本操作:(1)向下调整:O(log(n))完全二叉树的高度(2)建堆:O(n)2. 优先级队列(堆的应用):(1)查看堆顶元素:O(1)(2)添加元素(向上调整):O(log(n))(3) 删除堆顶元素(替换 + 向下调整):O(log(n))

AwwzJ_0821的博客 959

避坑指南:CentOS7.9安装Python3.8.16后yum报错的快速修复方法

本文详细解析了在CentOS7.9系统安装Python3.8.16后导致yum报错的原因,并提供了快速修复方法。通过修改yum配置文件指向Python2解释器,以及使用alternatives工具管理多版本Python,有效解决兼容性问题。同时推荐使用虚拟环境隔离开发环境,避免影响系统稳定性。

weixin_26908317的博客 497

堆的概念及基本操作实现

1.堆的基本概念: 严格来讲,堆有不同的种类,但是我们在算法学习中,主要用的还是二叉堆,而二叉堆有最大堆和最小堆之分。 最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树,同时也是一棵最大树。小顶堆是一棵完全完全二叉树,同时也是一棵最小树。 需要注意的问题是:堆中的任一子树也还是堆,即大顶堆的子树也都是大顶堆,小顶堆同样。

多反思,多回顾,要坚持。 1万+

Flash芯片的VCC上电到可操作时间过长

Flash的VCC上电到操作时间(tVSL)通常有最大值限制,如果超过这个时间,核心风险是状态机不同步和指令锁存错误。比如芯片内部振荡器可能已经尝试启动又休眠了,但主控却在这之后才发送指令,导致完全 misinterpreted。Flash芯片的(从电源上电到可以正常进行读写操作的时间)如果过长,会产生一系列负面影响简单来说,这个时间过长意味着电源上升速度太慢,违反了芯片的要求。

qq_61918649的博客 723

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2758

堆的实现(数据结构)

一、问题描述 堆是什么?堆也叫做优先队列,一些按照重要性或优先级来组织的对象称为优先队列。 为什么需要堆?在现实生活中,存在许多需要从一群人、一些任务或一些对象中找出“下一位最重要”目标的情况。例如:在平时处理事情的时候我们总会先把“下一个最重要的”的事情取出来先处理。在处理的过程中,可能还会有其他的事情加进来。因此在事情处理完的事情,我们又要重新找出“下一个最重要”的事情进行处理。 如何......

Alexwym的博客 2214

实战避坑:在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时,必须搞清的P2P DMA与IOMMU那些事

本文深入探讨在Ubuntu 22.04上配置NVIDIA GPU Direct RDMA时P2P DMA与IOMMU的关键问题,解析PCIe架构中的地址转换、P2P DMA与标准DMA的区别,以及IOMMU对性能的影响。通过实战案例和调优建议,帮助用户避免常见配置陷阱,提升AI训练集群的数据传输效率。

weixin_33720078的博客 444

堆的简单理解和实现

堆的简单理解和实现

Ryujianli的博客 217

三、分区配置

rk3566/rk3568 修改分区

暮云星影的博客 514

实战指南:利用 LangGraph 的状态管理实现多轮对话的上下文隔离与持久化

本文详细介绍了如何利用LangGraph的状态管理机制,高效实现多轮对话中的上下文隔离与持久化。通过实战代码演示,从基础的消息历史管理到自定义状态扩展,再到使用SQLite进行生产级持久化,系统讲解了如何借助LangGraph的State和Checkpointer自动化处理对话记忆、用户隔离及数据存储,显著提升开发效率。

weixin_28396629的博客 488

数据结构之堆的实现和基本操作

堆的操作

m0_62332997的博客 585

RK3588 平台imx334 驱动调试记录

rk3588调试imx334

xiaoning132的专栏 1790

数据结构串 堆串基本操作C语言实现

【数据结构】串 堆串的基本操作 以一组地址连续的存储单元存放串值字符序列,存储空间在程序执行过程中动态分配得到,操作灵活。 代码: 1.结构体定义 typedef struct { char * ch; //若是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度 }HString; 2.基本操作函数声明 // 基本操作的函数原型说明 //初始化生成一个空...

欢乐佛的博客 8437

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

堆的基本操作的实现

什么是堆? 是一种特殊的“队列”,取出元素的顺序依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。 堆的特性: (1)结构特性:用数组表示的完全二叉树; (2)有序性:任一结点的关键字是其子树所有结点的最大值或最小值(对应最大堆、最小堆)。 故对堆进行操作时一定不能破坏这两特性。 堆的基本操作: #define MaxData 。。。//建议设一个堆的最大元素值作为哨兵,在对堆进行操作...

derbi123123的博客 608

VC中sqlite的使用

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

堆的基本操作(c语言实现)

1.7.获取堆的数据个数。

2301_80224556的博客 1102

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

利用C语言模拟实现堆的基本操作和调堆算法

主要讲述了堆的基本原理和特性,使用C语言模拟实现堆的初始化、插入、删除等基本操作,通过回调函数和函数指针实现大根堆和小根堆的不同调堆算法,堆的应用场景和优势等内容

螺蛳粉只吃炸蛋的走风的博客 537

C语言实现堆的基本操作

文章目录前言基本的操作一、头文件及定义堆二、创建最大堆三、判断堆满/空四、插入操作五、删除操作完整代码 前言 本文用C语言实现了堆的基本操作,包括:创建堆、判断堆满/空、插入、删除。虽然在C++的STL中已经分装好了堆数据结构,但是在不少的场合会用到自己写的堆。   基本的操作 堆分为最大堆和最小堆,本文对最大堆进行了说明,最小堆可模仿写出。   一、头文件及定义堆 代码: #include <stdio.h> #include <stdlib.h> #de

weixin_44915226的博客 1986

最小堆的基本操作实现

1. 最小堆结构定义如下: // 定义最小堆结构 struct MinHeap { int* p; // 存储元素的数组 int size; // 当前元素个数 int capacity; // 最大容量 }; 2. 最小堆的基本操作函数如下: MinHeap* createMinHeap(int capacity); // 创建最小堆 bo...

774

【C语言】堆的实现(建堆、堆的基本操作、堆排序、TOK问题)详解

这篇文章讲解了堆数据结构,以及堆的实现和使用等。

EWIAW_ilove的博客 5164

python实现堆的基本操作及堆相关练习

堆(heap) 又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆一下,在队列中,我们可以进行的限定操作是dequeue和enqueue。 dequeue是按照进入队列的先后顺序来取出元素。而在堆中,我们不是按照元素进入队列的先后顺序取出元素的,而是按照元素的优先级取出元素。 性质 堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质。 任意节点小于(或大于)它的

sereasuesue的博客 1461

堆的一些基本操作实现

//关于建堆和对其的一些操作 #include <iostream> #include <algorithm> using namespace std; const int maxn=100; int heap[maxn],n=10;//将第一个结点储存在数组的一号位 //函数功能:对heap数组在low到high的范围内向下调整 void downAdjust(i...

weixin_45342551的博客 234

PHP实现堆基本操作

通过insert()方法向堆中插入元素,使用top()方法获取堆顶元素(即最小值),使用extract()方法弹出堆顶元素(即最小值)。最后,我们分别打印了堆中的元素。需要注意的是,SplMinHeap类和SplMaxHeap类都是SplHeap类的子类,它们提供了一些默认的实现来满足最小堆和最大堆的特性。您还可以通过实现自己的堆类来定制堆的行为。在PHP中,可以使用堆数据结构的扩展库(如SplMinHeap和SplMaxHeap)来实现堆的基本操作。PHP中可以使用数组来实现堆的基本操作。

qq_39294511的博客 287

堆的基本操作——基于数组实现

SiftUp void siftUp(int i) { bool done = false; if(i==1) return;//根节点,无法上移 while(i==1 || done) { if(h[i]>h[i/2]) { int temp = h[i]; h[i] = h[i/2]; h[i/2] = temp; ...

爱代码的涛的博客 302

用C实现堆的基本操作

C语言实现堆

d_优快云W的博客 405
上一篇: 项目-----注释转换
下一篇: 搜索二叉树的基本操作-----数据结构
CYD、孤狼
博客等级 码龄9年 24粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值