最小堆的大建立及其一些基本操作

本文介绍了一个使用C语言实现的最小堆数据结构。包括创建、插入、删除最小元素等核心操作,并提供了完整的代码示例。

最小堆,能够维护最的的元素的最上面。同样还有最大堆等



#include <stdio.h>

#include<stdlib.h>

typedef int ElementType;
ElementType MinDate = -10000 ;
struct HeapStruct;
typedef struct HeapStruct *PriorityQueue;

PriorityQueue Initialize(int Maxelement);       //创建并初始化
void Destory(PriorityQueue H);                      //销毁最小堆
void MakeEmpty(PriorityQueue H);                //清空堆
void Insert(ElementType X,PriorityQueue H);    //插入X
ElementType DeleteMin(PriorityQueue H);        //删除堆中最小值
ElementType FindMin(PriorityQueue H);            //查找最小值,返回最小值
int IsEmpty(PriorityQueue H);                            //判空
int IsFull(PriorityQueue H);                                //判满


int main(void)        //主函数,最小堆,利用顺序储存结构
{
    PriorityQueue H;
    H = Initialize(40);

    Insert(45,H);
    Insert(11,H);
    Insert(30,H);
    Insert(88,H);


    printf("%d\n",FindMin(H));

 //   printf("Hello World!\n");
    return 0;
}

struct HeapStruct
{
    int Capacity;\
    int Size;
    ElementType *Elements;
};

PriorityQueue Initialize(int Maxelement)                    //创建并初始化一个最小堆
{
    PriorityQueue H;

    H = (PriorityQueue)malloc(sizeof(struct HeapStruct));   //为总的结构体发配空间
    if( NULL == H)
    {
        printf("Out of Space\n");
    }
                                                     //为结构体中数组发配空间,其中储存每个元素
    H->Elements =  (ElementType*)malloc((Maxelement + 1) * sizeof(ElementType));
    if(NULL == H->Elements )
    {
        printf("Out of Space\n");
    }

    H->Capacity = Maxelement;                       //储存数组最大值
    H->Size = 0;                                    //初始化size
    H->Elements[0] = MinDate;                       //初始化最小值

    return H;
}

void Insert(ElementType X, PriorityQueue H)
{
    int i;

    if(IsFull(H))                                       //判满
    {
        printf("Priority Is Full\n");
    }                                                   //每次插入一次,size++一次。建立一个空穴
    for(i = ++H->Size; H->Elements[i / 2] > X;i /= 2)   //如果X小于父亲的值,空穴上移一层
    {
        H->Elements[i] = H->Elements[i/2];
    }
    H->Elements[i] = X;                                 //将X填入空穴

}



void Destory(PriorityQueue H)
{
    free(H->Elements);
    free(H);
}

void MakeEmpty(PriorityQueue H)
{
    H->Size = 0;
}

/*
    删除最小元比较容易,因为堆中第一个元素就是最小元。难的是删除最小元后,怎么维护这个最小堆。
    一种思路是,将儿子节点中较小的那个提为父亲,一直这样下去,直到最后一层。也就是将空穴一直
    沿着最小元传递下去
*/
ElementType DeleteMin(PriorityQueue H)          //删除堆中最小值
{
    int i,Child;
    ElementType MinElement,LastElement;
    if(IsEmpty(H))
    {
        printf("Priority Is Empty\n");
        return H->Elements[0];

    }

    MinElement = H->Elements[1];                //堆中最小的元素
    LastElement = H->Elements[H->Size--];       //堆中最后一个元素,因为从数组从1开始,所以要size--
                                                //并且size--,也标志着数组中元素减一
    for(i = 1; i * 2 <= H->Size; i = Child )
    {
        Child = 2 * i;
        if(Child != H->Size && H->Elements[Child + 1] < H->Elements[Child]) //找到左右孩子中较小的
            Child++;

        if(LastElement > H->Elements[Child])
            H->Elements[i] = H->Elements[Child];
        else
            break;

    }

    H->Elements[i] = LastElement;

    return MinElement;
}

ElementType FindMin(PriorityQueue H)                //堆中最小元为数组下标为1的元素
{
    if(IsEmpty(H))
    {
        printf("Priority Is Empty\n");
        return H->Elements[0];
    }

    return H->Elements[1];
}

int IsEmpty(PriorityQueue H)                    //如果数组大小为0的话,数组为空
{
    return H->Size == 0;
}

int IsFull(PriorityQueue H)                     //如果数组的大小为最大值的话,数组满了
{
    return H->Size == H->Capacity;
}




















为了设计与SCI(科学引文索引)相关的配色方案,可以参考科学研究领域常见的颜色搭配原则以及学术图表中的经典配色风格。以下是几种方法和建议: --- ### 方法一:采用科学研究领域的标准配色 科学研究中常用的配色以简洁、直观为主,通常包括以下几类颜色组合: - **蓝色系**:代表数据和技术,例如深蓝 (#003f5c) 和浅蓝 (#66c2a5)。 - **绿色系**:象征自然和增长,适合生态学或生物学主题,如森林绿 (#4daf4a)。 - **红色系**:用于强调重要结果或对比项,如鲜红 (#e41a1c)。 这些颜色常出现在Matplotlib、Tableau等数据分析工具的默认模板中。 --- ### 方法二:借鉴知名期刊封面的颜色 许多顶级期刊封面采用了独特的配色方案,可供参考: - **Nature**:以白色背景结合鲜艳的主题色(如橙色 #ff7f00),突出重点内容。 - **Science**:多使用灰色调 (#999999),辅以亮色调点缀,营造现代感。 - **Cell**:偏好柔和渐变效果,常用紫色 (#8da0cb) 和黄色 (#ffd92f) 组合。 --- ### 方法三:利用在线工具生成专业配色方案 一些网站提供专门针对科研图表和报告的设计服务,能够快速生成合适的配色方案: - **ColorBrewer (colorbrewer2.org)**:专注于地图和统计图形的配色选择,支持无色盲障碍选项。 - **Paletton (paletton.com)**:可以根据输入的基础色自动推荐协调的配色方案。 - **Coolors (coolors.co)**:实时调整颜色并导出为多种格式,方便应用于PPT或论文插图。 --- ### 方法四:遵循色彩心理学的原则 在设计过程中考虑目标受众的心理反应: - 冷色调(如蓝色、青色)传递冷静、理性的感觉,适用于技术型文章。 - 温暖色调(如红色、橙色)激发活力和热情,适合作为核心结论的高亮显示。 - 中性灰度则能平衡整体布局,避免过于刺眼。 --- ### 示例代片段:Python实现基础配色方案 如果需要程序化生成配色方案,可以尝试如下代: ```python import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 定义一组经典的SCI配色 colors = ['#003f5c', '#58508d', '#bc5090', '#ff6361', '#ffa600'] custom_cmap = ListedColormap(colors) # 可视化配色条 plt.figure(figsize=(8, 3)) plt.imshow([list(range(len(colors)))], cmap=custom_cmap, aspect='auto') plt.xticks(list(range(len(colors))), colors) plt.yticks([]) plt.title('Example of SCI Color Palette') plt.show() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值