数据结构之堆

简介: 数据结构之堆

在前面的学习中,我们已经学习了数据结构中的顺序表,链表,栈,队列。这些数据结构都是线性数据结构,从这篇文章开始,我们将要研究这种非线性数据结构。

堆的介绍

首先介绍一下什么是树

树是有限个节点构成的具有层次关系的集合。因为这种关系的逻辑图看起来像一颗倒挂的树,故叫做树。

其次介绍一下树的种类

树又分为二叉树非二叉树,二叉树又分为完全二叉树满二叉树。这篇文章主要详细介绍,堆是一种完全二叉树

其次介绍一下堆的种类

堆又分为大堆,小堆。大堆:父节点大于等于子节点  小堆:父节点小于等于子节点

堆的实现

堆的实现:堆的逻辑结构是完全二叉树,存储结构是顺序结构。下面以小堆的实现为例。

要实现堆,首先明白堆的逻辑结构完全二叉树存储结构顺序表

在完全二叉树中,有如下结论

父节点找左孩子:parent*2+1

父节点找右孩子:parent*2+2

孩子找父节点:(child-1)/2

heap.h

 

heap.c

堆的初始化

1. void IntiHeap(Hp* heap)
2. {
3.  assert(heap);
4. //malloc一块空间,用来初始化顺序表
5.  DateType* tmp = (DateType*)malloc(4 * sizeof(DateType));
6.  assert(tmp);//保证malloc成功
7.  heap->arr = tmp;//初始化顺序表
8.  heap->size = 0;//有效数据个数0
9.  heap->capcity = 4;//初始容量4
10. }

堆的销毁

1. void DestoryHeap(Hp* heap)
2. {
3.  assert(heap);
4.  free(heap->arr);//释放顺序表空间
5.  heap->arr = NULL;//将指针置空,避免成为野指针
6.  heap->size = 0;//有效数据置0
7.  heap->capcity = 0;//容量置0
8. }

堆的插入

堆的插入是这里的关键,这里以小堆为例,欲在小堆里插入一个元素,这里的步骤为:

step1.直接插入到堆尾        step2.向上调整。

1. void HeapPush(Hp* heap, DateType n)
2. {
3.  assert(heap);
4.  if (heap->size == heap->capcity)//检查容量
5.  {
6.    //扩容
7.    DateType* tmp = realloc(heap->arr, 2 * heap->capcity * sizeof(DateType));
8.    assert(tmp);
9.    heap->arr = tmp;
10.     heap->capcity *= 2;
11.   }
12.   //直接插入,未做调整step1
13.   heap->arr[heap->size] = n;
14.   heap->size++;
15.   //向上调整step2
16.   UpAdjust(heap->arr, heap->size - 1);//参数为堆的存储顺序表和堆尾节点下标(孩子)
17. }

向上调整算法

1. void UpAdjust(DateType* arr, int child)//向上调整算法
2. {
3.  int parent = (child - 1) / 2;//找到父亲节点
4.  while (child != 0)//直到child成为0,不需要向上调整
5.  {
6.    if (arr[child] < arr[parent])//如果不满足小堆定义
7.    {
8.      //交换
9.      swap(&arr[child],&arr[parent]);
10.     }
11.     else//满足就不需要向上调整了
12.     {
13.       break;
14.     }
15. //向上迭代child,parent
16.     child = parent;
17.     parent = (child - 1) / 2;
18.   }
19. }

堆顶元素删除

堆顶元素删除的步骤为:

step1.交换堆顶元素和堆尾元素,直接删除堆尾元素    step2.向下调整堆。

1. void HeapPop(Hp* heap)
2. {
3.  assert(heap);
4.  assert(!HeapEmpty(heap));//保证堆不为空
5.  //step1:先交换,再size--,再调整堆
6.  swap(&heap->arr[0], &heap->arr[heap->size - 1]);
7.  heap->size--;
8.  //step2:调堆,向下调整算法
9.  DownAdjust(heap->arr, heap->size, 0);
10. }

向下调整算法:

step2

1. //堆的存储结构 堆的有效数据个数 向下调整起始父节点
2. void DownAdjust(DateType* arr, int size, int parent)
3. {
4.  int child = parent * 2 + 1;//找到左孩子
5.  while (child<size)
6.  {
7. //防止没有右孩子,越界
8.    if (child+1<size&&arr[child] > arr[child + 1])//调整并找到数据较小的child
9.    {
10.       child++;//由左孩子变为右孩子
11.     }
12. 
13.     if (arr[child] < arr[parent])//如果不满足小堆定义
14.     {
15.       swap(&arr[child], &arr[parent]);//交换
16. //迭代
17.       parent = child;
18.       child = parent * 2 + 1;
19.     }
20.     else
21.     {
22.       break;
23.     }
24.   }
25. }

判断堆是否为空

1. bool HeapEmpty(Hp* heap)
2. {
3.  assert(heap);
4.  return heap->size == 0;
5. }

获取堆顶元素

1. DateType TopHeap(Hp* heap)
2. {
3.  assert(heap);
4.  return heap->arr[0];
5. }

获取堆有效数据

1. int HeapSize(Hp* heap)
2. {
3.  return heap->size;
4. }


相关文章
|
12天前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
28 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
14天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
57 16
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
68 1
|
2月前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
52 5
【数据结构】优先级队列(堆)从实现到应用详解
|
1月前
|
存储 算法 调度
数据结构--二叉树的顺序实现(堆实现)
数据结构--二叉树的顺序实现(堆实现)
|
1月前
|
存储 算法 分布式数据库
【初阶数据结构】理解堆的特性与应用:深入探索完全二叉树的独特魅力
【初阶数据结构】理解堆的特性与应用:深入探索完全二叉树的独特魅力
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
1月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
29 0
|
1月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
1月前
【数据结构】大根堆和小根堆
【数据结构】大根堆和小根堆
27 0