数据结构二叉树--堆(数据结构实现和堆排序的一种实现)

堆是一个数据结构

逻辑结构:完全二叉树(要求父节点大于孩子节点或者小于孩子节点)

存储结构:顺序存储

cpp 复制代码
typedef int DataType;
typedef struct Heap{
    DataType*data;
    int size;
    int capacity;
}Heap;

void InitHeap(Heap*pH)
{
    assert(pH);
    pH->data=NULL;
    pH->size=0;
    pH->capacity=0;
}

void expand(Heap*pH)
{
    DataType*p=realloc(pH->a,sizeof(DataType)*(pH->capacity+2));
    if(p==NULL){
        printf("%s",strerror(errno));    
    }
    pH->data=p;
    pH->capacity+=2;
}

void Swap(int*n1,int*n2)
{
    int tmp=*n1;
    *n1=*n2;
    *n2=tmp;
}

void AdjustUp(Heap*pH,int child)
{
    while(child>0){
        int parent=(child-1)/2;
        if(data[child]<data[parent]){
            Swap(&data[child],&data[parent]);
            child=parent;
        }else{
            break;
        }
    }
}

void HeapPush(Heap*pH,int n)
{
    assert(pH);
    expand(pH);
    pH->data[pH->size++]=n;
    AdjustUp(pH->data,pH->size-1);
}

void AdjustDown(DataType*data,int parent,int size)
{
    int child=2*parent+1;
    while(child>n&&child+1>n){
        if(data[child]>data[child+1]){
            child+=1;
        }
        if(data[parent]>data[child]){
            Swap(&data[parent],&data[child]);
            parent=child;
            child=2*parent+1;
        }
    }
    
}

void HeapPop(Heap*pH)
{
    assert(pH->size);
    Swap(&pH->data[0],&pH->data[pH->size-1]);
    pH->size--;
    AdjustDown(pH->data,0,pH->size);
}

这是堆的基本操作,我们如果有一个数组,想借助堆这个数据结构利用额外的空间来实现排序,那么先依次将数据放入堆中,再依次删除并将删除的数据放入到数组中完成排序。每一次插入的时间复杂度最多都是O(logN),删除也一样,比起之前冒泡排序O(n^2)要好一些。

但是有很大的缺点,首先就是要有一个堆,每次都先这样实现堆很麻烦,还有一点是空间复杂度为O(N),有额外开辟的空间。我们可以这样做:用一个指针从左到右依次扫描数组,向上调整算法的使用前提是本身为堆,那我们从下标为1的元素开始,扫描到一个相当于插入了一个,然后用向上调整算法调整为堆,再扫描下一个+调整,扫描完最后一个元素为止。那么这个数组就是一个堆了,如果我们想升序排列,则整理为大堆,先找最大的数据放在最后,如果想降序排列就先找最小的,也就是小堆。why?如果我们排列升序,先找最小的,那么后面的元素怎么办?需要重新整理成堆,时间复杂度为N^2*logN,这比N^2的时间复杂度还要高,没必要搞这么一堆出来了,所以排升序找最大的。排成堆+交换就找出了最大的,然后排成堆+交换就找出了次大的,以此类推即可。这个做法的本质就是在一个数组上模拟堆的插入和删除,扫描增加一个就是插入,交换一次就是删除。

相关推荐
handler016 分钟前
【算法】并查集(普通/扩展/带权)模板与例题
数据结构·c++·笔记·算法·c·图论·查并集
qq74223498422 分钟前
从“感知”到“决断”:测评百度伐谋产业决策智能体的端到端推理与行动机制
人工智能·算法·百度·大模型·运筹优化
huohaiyu1 小时前
深入解析Java垃圾回收机制
java·开发语言·算法·gc
浮芷.1 小时前
鸿蒙PC端 TTS 并发调用问题详解:资源竞争与队列管理
算法·华为·开源·harmonyos·鸿蒙·鸿蒙系统
装不满的克莱因瓶1 小时前
掌握感知器的学习原理
人工智能·python·神经网络·算法·ai·卷积神经网络
Lsk_Smion1 小时前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论
轻微的风格艾丝凡2 小时前
两电平三相VSC整流模式从不控整流平滑切换至有源整流调试记录
算法·dsp·c2000
dongf20192 小时前
R语言KNN算法
算法·数据分析·r语言
小O的算法实验室2 小时前
2025年IEEE TASE,基于双层耦合平均场博弈的大规模智能体集成任务分配与轨迹规划
人工智能·算法·机器学习
8Qi82 小时前
LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
算法·leetcode·二叉树·动态规划