堆
时间: 2025-05-22 14:21:52 AIGC 浏览: 28
### 数据结构堆的概念
堆是一种特殊的非线性数据结构,能够被视作一棵完全二叉树的数组对象[^1]。对于一个关键码集合 \( K = \{ k_0, k_1, ..., k_{n-1} \} \),当其按照完全二叉树顺序存储在一维数组中并满足特定条件时,则形成小堆或大堆。
#### 小堆与大堆定义
如果对于所有的父节点索引 \( i \) (\(i = 0, 1, ...\)),都满足:
\[ K_i <= K_{2*i+1} \quad 和\quad K_i <= K_{2*i+2}\]
那么这样的堆被称为小堆(或最小堆)。反之,若上述不等号方向相反,则构成大堆(或最大堆)。
### 堆的应用之一:堆排序
堆排序涉及两个主要阶段—建堆和实际排序过程。通过一系列从上至下的调整操作可构建初始堆;随后不断交换堆顶元素到序列末端,并逐步缩小堆规模直至完成全部排序工作[^2]。
### 实现细节
为了实现高效的堆操作,通常会采用如下C++代码片段展示如何执行向下调整算法 `down` 函数用于维护堆性质不变:
```cpp
void down(int x) {
int t = x;
if (2 * x <= siz && h[2 * x] < h[t]) t = 2 * x;
if (2 * x + 1 <= siz && h[2 * x + 1] < h[t]) t = 2 * x + 1;
if (x != t) {
swap(h[x], h[t]);
down(t);
}
}
```
此函数接收当前待处理结点的位置作为参数,并确保该位置及其子节点遵循正确的堆序关系[^5]。
### 结构体表示法
在编程实践中,可以通过定义结构体来封装堆的相关属性,如下面所示的例子展示了基本类型的声明以及初始化方法:
```c
typedef struct heap {
HPDataType *arr; // 存储堆元素的一维数组
int size; // 当前堆内元素数量
int capacity; // 数组的最大容量
} Heap;
// 初始化一个新的空堆实例
void HeapInit(Heap* hp) {
assert(hp);
hp->arr = NULL;
hp->size = hp->capacity = 0;
}
```
这里定义了一个名为 `heap` 的结构体用来保存堆的信息,并提供了一种简单的方式创建新的堆实例[^4]。
阅读全文
相关推荐














