【数据结构与算法】堆的实现(附源码)(下)

简介: 【数据结构与算法】堆的实现(附源码)(下)

C.删除 Heappop  向下调整  AdjustDown

1.删除的话,我们是要删除堆顶的数据,因为删除堆尾的数据并没有什么实际意义,删除就是让size--,但是堆顶数据的下标是0,所以在删除前应先交换堆顶和堆尾的数据

2.删除完后,还要保持它还是个堆,不能把后面的顺序搞乱了,要想达到这个目的,就需要使用到向下调整这个函数;

3.假设是大堆,向下调整是父节点与其较大的子节点比较,如果较大的那个子节点大于父节点,则二者交换,然后较大的子节点成为了新的父节点,当子节点的下标大于或是等于节点总数,也就是size时,就结束循环。

 

D.堆的判空  Heapempty  堆顶数据  Heaptop  堆的大小  Heapsize

这些接口的实现都非常简单,博主就不在这里讲述了,可以参考后面的源码。


三.源码

Heap.h

1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <assert.h>
4. #include <stdbool.h>
5. #include <time.h>
6. 
7. #define MAX_MIN <   //通过改变这里的符号,可以决定是建大堆还是小堆
8. 
9. typedef int HPdatatype;
10. 
11. typedef struct Heap
12. {
13.   HPdatatype* arr;
14.   int size;
15.   int capacity;
16. }Heap;
17. 
18. void Heapinit(Heap* php);
19. 
20. void Swap(HPdatatype* p1, HPdatatype* p2);
21. 
22. void AdjustUp(HPdatatype* arr, int child);  //向上调整
23. 
24. void Heappush(Heap* php, HPdatatype x);
25. 
26. void AdjustDown(HPdatatype* arr, int parent, int n);  //向下调整
27. 
28. void Heappop(Heap* php);
29. 
30. HPdatatype Heaptop(Heap* php);
31. 
32. int Heapsize(Heap* php);
33. 
34. bool Heapempty(Heap* php);
35. 
36. void Heapdestroy(Heap* php);

Heap.c

1. #include "Heap.h"
2. 
3. 
4. void Heapinit(Heap* php)
5. {
6.  assert(php);
7. 
8.  php->arr = (HPdatatype*)malloc(sizeof(HPdatatype) * 4);
9.  if (php->arr == NULL)
10.   {
11.     perror("malloc fail");
12.     exit(-1);
13.   }
14.   php->size = 0;
15.   php->capacity = 4;
16. }
17. 
18. void Swap(HPdatatype* p1, HPdatatype* p2)
19. {
20.   HPdatatype tmp = *p1;
21.   *p1 = *p2;
22.   *p2 = tmp;
23. }
24. 
25. ///С
26. 
27. void AdjustUp(HPdatatype* arr, int child)
28. {
29.   assert(arr);
30. 
31.   int parent = (child - 1) / 2;
32. 
33.   while (child > 0)
34.   {
35.     if (arr[child] MAX_MIN arr[parent])
36.     {
37.       Swap(&arr[child], &arr[parent]);
38.       child = parent;
39.       parent = (child - 1) / 2;
40.     }
41.     else
42.       break;
43.   }
44. }
45. 
46. void Heappush(Heap* php, HPdatatype x)
47. {
48.   assert(php);
49. 
50.   if (php->size == php->capacity)   //插入前,判断数组是否已满
51.   {
52.     HPdatatype* tmp = (HPdatatype*)realloc(php->arr, 2 * sizeof(HPdatatype) * php->capacity);
53.     if (tmp == NULL)
54.     {
55.       perror("realloc fail");
56.       exit(-1);
57.     }
58. 
59.     php->arr = tmp;
60.     php->capacity *= 2;
61.   }
62. 
63.   php->arr[php->size] = x;
64.   php->size++;
65. 
66.   AdjustUp(php->arr, php->size - 1);  //这里要传size-1
67. }
68. 
69. void AdjustDown(HPdatatype* arr, int parent, int n)
70. {
71.   assert(arr);
72. 
73.   int child = 2 * parent + 1;
74. 
75.   while (child < n)
76.   {
77. //判断较大(较小)的子节点
78.     if ((child + 1) < n && arr[child + 1] MAX_MIN arr[child])  
79.     {
80.       child++;
81.     }
82. 
83.     if (arr[child] MAX_MIN arr[parent])
84.     {
85.       Swap(&arr[child], &arr[parent]);
86.       parent = child;
87.       child = 2 * parent + 1;
88.     }
89.     else
90.       break;
91.   }
92. }
93. 
94. void Heappop(Heap* php)
95. {
96.   assert(php);
97.   assert(php->size);
98.   Swap(&php->arr[0], &php->arr[php->size - 1]);
99.   php->size--;
100. 
101.  AdjustDown(php->arr, 0, php->size);
102. }
103. 
104. HPdatatype Heaptop(Heap* php)
105. {
106.  assert(php);
107.  assert(php->size);   //为空时不能取数据
108. 
109.  return php->arr[0];
110. }
111. 
112. int Heapsize(Heap* php)
113. {
114.  assert(php);
115. 
116.  return php->size;
117. }
118. 
119. bool Heapempty(Heap* php)
120. {
121.  assert(php);
122. 
123.  return php->size == 0;  //size==0即为空
124. }
125. 
126. void Heapdestroy(Heap* php)
127. {
128.  assert(php);
129.  free(php->arr);
130.  php->arr = NULL;
131.  php->size = 0;
132.  php->capacity = 0;
133. }

test.c

1. #include "Heap.h"
2. 
3. 
4. void testHeap()
5. {
6.  Heap hp;
7.  Heapinit(&hp);
8. 
9.  int i = 0, n = 10;
10.   int x = 0;
11.   while (n)
12.   {
13.     x = rand() % 100 + 1;
14. 
15.     Heappush(&hp, x);
16.     n--;
17.   }
18.   while (!Heapempty(&hp))
19.   {
20.     printf("%d  ", Heaptop(&hp));
21.     Heappop(&hp);
22.   }
23. 
24.   printf("\n");
25.   Heapdestroy(&hp);
26. }
27. 
28. int main()
29. {
30.   srand((unsigned int)time(NULL));
31.   testHeap();
32. 
33.   return 0;
34. }

🐲👻这循环队列的讲解就到这里了,若有错误或是建议欢迎小伙伴们指出。🐯🤖

🥰🤩希望小伙伴们可以多多支持博主哦。😍😃

😁😄谢谢你的阅读。😼😸


目录
相关文章
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
3月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
192 3
|
6月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
492 19
|
6月前
|
数据库 C++
【数据结构进阶】红黑树超详解 + 实现(附源码)
本文深入探讨了红黑树的实现原理与特性。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和特定规则,确保树的高度接近平衡,从而实现高效的插入、删除和查找操作。相比AVL树,红黑树允许一定程度的不平衡,减少了旋转调整次数,提升了动态操作性能。文章详细解析了红黑树的性质、插入时的平衡调整(变色与旋转)、查找逻辑以及合法性检查,并提供了完整的C++代码实现。红黑树在操作系统和数据库中广泛应用,其设计兼顾效率与复杂性的平衡。
1030 3
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
1263 0
|
9月前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
660 5
|
10月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
352 7
|
10月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
409 8
|
10月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
675 8

热门文章

最新文章