目录
一、堆的概念和结构
1:堆的概念
上文中我们已经提到过,堆是一个按照完全二叉树的储存方式顺序储存在一个一维数组中的结构。
堆:如果有一个关键码的集合K = {k0,k1,k2,k3…k(n-1)},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki<=K(2*i+1)且Ki<=K(2*i+2) {Ki>=K(2*i+1)且Ki>=K(2*i+2)} i = 0,1, 2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
1.小堆:每一个父结点的值均小于或等于其子结点的值,且其根结点的值是最小的。
2.大堆:每一个父结点的值均大于或等于其子结点的值,且其根结点的值是最大的。
· 堆的性质:
1. 堆中某个节点的值总是不大于或不小于其父节点的值;
2. 堆总是一棵完全二叉树。
2:堆的结构
二、堆的实现
1:堆的简单接口实现
创建堆结构
·思路:
堆是用数组实现的,所以创建堆结构实质上就是开辟一个动态数组。
· Heap.h文件:
//创建堆结构(以小堆为例) typedef int HPDataType; //堆中储存数据类型 typedef struct Heap { HPDataType* a; //数组地址 size_t size; //记录堆中有效数据个数 size_t capacity; //记录堆的容量 }HP;
初始化堆
·思路:
初始化堆和之前初始化顺序表,栈等都是同样的道理。
· Heap.h文件:
//初始化堆 void HeapInit(HP* php);
· Heap.c文件:
//初始化堆 void HeapInit(HP* php) { assert(php); //传过来的结构体指针不能为空 php->a = NULL; php->size = php->capacity = 0; }
堆的打印
·思路:
堆的物理结构是数组,所以打印堆实质上就是打印顺序表。
· Heap.h文件:
//堆的打印 void HeapPrint(HP* php);
· Heap.c文件:
//堆的打印 void HeapPrint(HP* php) { assert(php); for (size_t i = 0; i < php->size; i++) { printf("%d ", php->a[i]); } printf("\n"); }
堆的销毁
·思路:
free掉动态开辟的内存
· Heap.h文件:
//堆的销毁 void HeapDestory(HP* php);
· Heap.c文件:
//堆的销毁 void HeapDestory(HP* php) { assert(php); free(php->a); php->a = NULL; php->size = php->capacity = 0; }
堆的数据交换
·思路:
思路和交换两个整型数据一样,同时记得传地址。
· Heap.h文件:
//数据交换 void Swap(HPDataType* pa, HPDataType* pb);
· Heap.c文件:
//数据交换 void Swap(HPDataType* pa, HPDataType* pb) { HPDataType tmp = *pa; *pa = *pb; *pb = tmp; }
堆的判空
·思路:
判断size是否为0,如果size为0则说明堆中无元素,堆为空。
· Heap.h文件: