C语言堆学习笔记

news/2025/2/25 9:11:10

1. 的定义

(Heap)是一种特殊的树形数据结构,它满足以下性质:

  • 是一个完全二叉树。
  • 中每个节点的值都大于或等于(最大)或小于或等于(最小)其子节点的值。

1.1 最大

在最大中,父节点的值总是大于或等于子节点的值。

    10
   /  \
  9    8
 / \  / \
7  6 5  4

1.2 最小

在最小中,父节点的值总是小于或等于子节点的值。

    1
   / \
  2   3
 / \ / \
4  5 6  7

2. 的表示方法

通常使用数组来表示,因为是完全二叉树,可以很方便地用数组存储。

2.1 数组表示法

  • 父节点的索引为 i,则其左子节点的索引为 2*i + 1,右子节点的索引为 2*i + 2
  • 子节点的索引为 i,则其父节点的索引为 (i-1)/2

3. 的基本操作

3.1 插入操作

插入新元素时,先将其放在的末尾,然后通过上滤(sift-up)操作将其移动到正确的位置。

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int size;
} Heap;

void initHeap(Heap* heap) {
    heap->size = 0;
}

void siftUp(Heap* heap, int index) {
    int parent = (index - 1) / 2;
    while (index > 0 && heap->data[parent] < heap->data[index]) {
        int temp = heap->data[parent];
        heap->data[parent] = heap->data[index];
        heap->data[index] = temp;
        index = parent;
        parent = (index - 1) / 2;
    }
}

void insert(Heap* heap, int value) {
    if (heap->size == MAX_SIZE) {
        printf("Heap overflow\n");
        return;
    }
    heap->data[heap->size] = value;
    siftUp(heap, heap->size);
    heap->size++;
}

3.2 删除操作

删除顶元素时,用的最后一个元素替换顶元素,然后通过下滤(sift-down)操作将其移动到正确的位置。

void siftDown(Heap* heap, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int largest = index;
    if (left < heap->size && heap->data[left] > heap->data[largest]) {
        largest = left;
    }
    if (right < heap->size && heap->data[right] > heap->data[largest]) {
        largest = right;
    }
    if (largest != index) {
        int temp = heap->data[index];
        heap->data[index] = heap->data[largest];
        heap->data[largest] = temp;
        siftDown(heap, largest);
    }
}

int deleteMax(Heap* heap) {
    if (heap->size == 0) {
        printf("Heap underflow\n");
        return -1;
    }
    int max = heap->data[0];
    heap->data[0] = heap->data[heap->size - 1];
    heap->size--;
    siftDown(heap, 0);
    return max;
}

3.3 排序

排序(Heap Sort)是一种利用这种数据结构所设计的排序算法。

void heapify(Heap* heap) {
    for (int i = (heap->size / 2) - 1; i >= 0; i--) {
        siftDown(heap, i);
    }
}

void heapSort(int* array, int size) {
    Heap heap;
    initHeap(&heap);
    for (int i = 0; i < size; i++) {
        insert(&heap, array[i]);
    }
    heapify(&heap);
    for (int i = size - 1; i >= 0; i--) {
        array[i] = deleteMax(&heap);
    }
}

4. 的应用

4.1 优先队列

实现的优先队列可以在O(log n)时间内插入元素和删除最大(或最小)元素。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    Heap heap;
} PriorityQueue;

void initPriorityQueue(PriorityQueue* pq) {
    initHeap(&pq->heap);
}

void enqueue(PriorityQueue* pq, int value) {
    insert(&pq->heap, value);
}

int dequeue(PriorityQueue* pq) {
    return deleteMax(&pq->heap);
}

4.2 排序

排序是一种基于的数据结构的排序算法,时间复杂度为O(n log n)。

void heapSort(int* array, int size) {
    Heap heap;
    initHeap(&heap);
    for (int i = 0; i < size; i++) {
        insert(&heap, array[i]);
    }
    heapify(&heap);
    for (int i = size - 1; i >= 0; i--) {
        array[i] = deleteMax(&heap);
    }
}

http://www.niftyadmin.cn/n/5865303.html

相关文章

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

鸿蒙ArkTS页面如何与H5页面交互?

鸿蒙页面如何与H5页面交互&#xff1f; 先看效果前言通信功能介绍Web组件使用问题 Harmony OS NEXT版本&#xff08;接口及解决方案兼容API12版本或以上版本) 先看效果 功能介绍 点击Click Me按钮可以接收展示鸿蒙传递给html的内容点击霓虹灯按钮可以同步更新底部鸿蒙页面的按…

Flutter系列教程之(2)——Dart语言快速入门

目录 1.变量与类型 1.1 num类型 1.2 String类型 1.3 Object与Dynamic 1.4 类型判断/转换 1.5 变量和常量 2.方法/函数 3.类、接口、抽象类 3.1 类 3.2 接口 4.集合 4.1 List 4.2 Set 4.3 Map 5.总结 Dart语言的语法和Kotlin、Java有类似之处&#xff0c;这里就通…

ADCS-ESC1漏洞环境构造与利用

原理 ESC1是ADCS中的一个漏洞&#xff0c;利用该漏洞可实现权限提升攻击。在 ESC1 漏洞利用中&#xff0c;攻击者通过一系列操作获取包含域管身份信息的证书后&#xff0c;利用 Rubeus.exe 工具&#xff0c;使用该证书获取 TGT 票据。一旦成功获取 TGT 票据&#xff0c;攻击者…

ubuntu windows双系统踩坑

我有个台式机&#xff0c;先安装的ubuntu&#xff0c;本来想专门用来做开发&#xff0c;后面儿子长大了&#xff0c;给他看了一下星际争霸、魔兽争霸&#xff0c;立马就迷上了。还有一台windows的笔记本&#xff0c;想着可以和他联局域网一起玩&#xff0c;在ubuntu上用wine跑魔…

react使用react-quill 富文本插件、加入handlers富文本不显示解决办法

可以调整图片大小 quill-image-resize-module-react 加入插件quill-image-resize-module-reactQuill.register("modules/imageResize", ImageResize); // 注册图片缩放富文本配置中加入如下const quildConfig {toolbar: {container: [["bold", "ital…

qt:多元素类,容器类,布局类

1.列表 List Widget 属性特点currentRow当前被选中的是第几行count一共有多少行sortingEnabled是否允许排序isWrapping是否允许换行itemAlignment元素的对齐方式selectRectVisible被选中的元素矩形是否可见spacing元素之间的间隔 方法特点addItem(const QString& label)…

【现代深度学习技术】卷积神经网络 | 图像卷积

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…