• 实现堆的各种基本运算的算法(数据结构)


    以小堆为例,大堆就举一反三了。

    堆的物理结构就是普通的数组,但是逻辑结构看成了一颗完全二叉树。

    小堆,就是树的每一个父节点都小于他的孩子节点。如图中第一排的a与b。大堆,就是树的每一个父节点都大于他的孩子节点。如图中第二排的a与b。我们要实现的功能就是将一个数组排成符合要求的序列。

    创建小堆

    1. typedef int HeapDataType;
    2. typedef struct Heap//小堆
    3. {
    4. HeapDataType* a;
    5. int size;
    6. int capacity;
    7. }HP;

    堆初始化

    1. //初始化堆
    2. void HeapInit(HP* php)
    3. {
    4. assert(php);
    5. php->a = NULL;
    6. php->size = php->capacity = 0;
    7. }

    向堆增加数据

    1. //Push数据
    2. void HeapPush(HP* php, HeapDataType x)
    3. {
    4. assert(php);
    5. if (php->size == php->capacity)
    6. {
    7. int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
    8. HeapDataType* temp = (HeapDataType*)realloc(php->a, sizeof(HeapDataType) * newcapacity);
    9. if (temp == NULL)
    10. {
    11. printf("realloc fail\n");
    12. exit(-1);
    13. }
    14. php->capacity = newcapacity;
    15. php->a = temp;
    16. }
    17. php->a[php->size++] = x;
    18. HeapAdjustUp(php->a, php->size-1);
    19. }

    删除堆顶数据

    每一次删除堆顶元素,都会再次形成一个新的堆,新堆的堆顶元素就是数组a中次
    小的值,再次删除,再形成新堆,堆顶就变成次次小的元素了。以此类推。

    1. //Pop数据
    2. void HeapPop(HP* php)
    3. {
    4. assert(php);
    5. assert(php->size > 0);
    6. Swap(&php->a[0], &php->a[php->size - 1]);
    7. php->size--;
    8. HeapAdjustDown(php->a, php->size, 0);
    9. }

    获得堆顶数据

    1. //获得堆顶数据
    2. HeapDataType HeapTop(HP* php)
    3. {
    4. assert(php);
    5. return php->a[0];
    6. }

    获得堆的有效大小

    1. //获得堆的有效大小
    2. size_t HeapSize(HP* php)
    3. {
    4. return php->size;
    5. }

    判断堆是否为空

    1. //判断堆是否为空
    2. bool HeapEmpty(HP* php)
    3. {
    4. assert(php);
    5. return php->size == 0 ? 1 : 0;
    6. }

     交换数据

    1. //交换数据
    2. void Swap(HeapDataType* p1,HeapDataType* p2)
    3. {
    4. HeapDataType p3 = *p1;
    5. *p1 = *p2;
    6. *p2 = p3;
    7. }

    向上调整数组形成堆

    1. //向上调整数组形成堆
    2. void HeapAdjustUp(HeapDataType* a, int child)
    3. {
    4. int parent = (child - 1) / 2;
    5. while (child > 0)
    6. {
    7. if (a[parent] > a[child])
    8. {
    9. Swap(&a[parent], &a[child]);
    10. child = parent;
    11. parent = (child - 1) / 2;
    12. }
    13. else
    14. {
    15. break;
    16. }
    17. }
    18. }

    向下调整数组形成堆

    1. //向下调整数组形成堆
    2. void HeapAdjustDown(int* a, int size, int parent)
    3. {
    4. int child = parent * 2 + 1;
    5. while (child < size)
    6. {
    7. if (child + 1< size && a[child + 1] < a[child])
    8. {
    9. child++;
    10. }
    11. if (a[parent] > a[child])
    12. {
    13. Swap(&a[parent], &a[child]);
    14. parent = child;
    15. child = parent * 2 + 1;
    16. }
    17. else
    18. {
    19. break;
    20. }
    21. }
    22. }

     销毁堆

    1. //销毁堆
    2. void HeapDestory(HP* php)
    3. {
    4. assert(php);
    5. free(php->a);
    6. php->a = NULL;
    7. php->size = php->capacity = 0;
    8. }

    所需头文件

    1. #pragma once
    2. #include "stdio.h"
    3. #include "stdlib.h"
    4. #include "string.h"
    5. #include "stdbool.h"
    6. #include "assert.h"

    main函数测试

    1. #include "Heap.h"
    2. int main()
    3. {
    4. int a[] = { 4,6,2,1,5,8,2,9};
    5. HP hp;//创建堆
    6. HeapInit(&hp);//初始化堆
    7. //将数组a内数据Push到堆中
    8. for (int i = 0; i < sizeof(a) / sizeof(int); ++i)
    9. {
    10. HeapPush(&hp, a[i]);
    11. }
    12. int k = 3;
    13. while (k--)
    14. {
    15. printf("%d\n", HeapTop(&hp));
    16. HeapPop(&hp);//每一次删除堆顶元素,都会再次形成一个新的堆,新堆的堆顶元素就是数组a中次
    17. //小的值,再次删除,再形成新堆,堆顶就变成次次小的元素了。以此类推。
    18. //所以打出来的会是升序的
    19. }
    20. while (!HeapEmpty(&hp))
    21. {
    22. printf("%d\n", HeapTop(&hp));
    23. HeapPop(&hp);
    24. }
    25. printf("\n");
    26. return 0;
    27. }

    结果

     

  • 相关阅读:
    Golang map
    C和C++教程
    线段树--
    反向传播法(backpropagation)的基本原理
    【Python机器学习】零基础掌握IsolationForest集成学习
    把 Oracle 数据库从 RAC 集群迁移到单机环境
    Leetcode 802. 找到最终的安全状态(DFS + 记忆化搜索)
    java高级---->Java动态代理的原理
    [Linux打怪升级之路]-环境变量
    二轮平衡小车1:舵机与电机的基本控制
  • 原文地址:https://blog.csdn.net/2301_79819250/article/details/138090477