堆的剖析:时间复杂度、空间复杂度和本质特征
发布时间: 2024-08-24 01:12:56 阅读量: 23 订阅数: 23
算法时间复杂度的实验测试.zip_堆排序;算法时间复杂度_时间复杂度_胡书晗
![堆排序](https://img-blog.csdnimg.cn/img_convert/3a07945af087339273bfad5b12ded955.png)
# 1. 堆的基本概念和理论基础
堆是一种完全二叉树数据结构,它满足以下性质:
- **堆序性:**每个节点的值都大于或等于其子节点的值。
- **完全性:**除了最后一层外,每一层都必须填满。
# 2. 堆的实现技巧
### 2.1 数组实现堆
#### 2.1.1 堆的结构和性质
使用数组实现堆时,将堆中的元素存储在一个连续的数组中。数组中的每个元素都对应堆中的一个节点。堆的结构可以表示为一个完全二叉树,其中每个非叶节点都有两个子节点,叶节点位于数组的末尾。
数组实现堆具有以下性质:
- **根节点**:数组中的第一个元素是堆的根节点,它具有最小(或最大)的值。
- **左子节点**:对于数组中索引为 `i` 的节点,其左子节点的索引为 `2 * i + 1`。
- **右子节点**:对于数组中索引为 `i` 的节点,其右子节点的索引为 `2 * i + 2`。
- **父节点**:对于数组中索引为 `i` 的节点,其父节点的索引为 `(i - 1) / 2`。
#### 2.1.2 堆的插入和删除操作
**插入操作**
插入操作将一个新元素添加到堆中,并保持堆的性质。插入操作的步骤如下:
1. 将新元素添加到数组的末尾。
2. 从新元素的父节点开始,与父节点比较,如果新元素更小(或更大),则交换两个元素。
3. 重复步骤 2,直到新元素到达根节点或其父节点的值更小(或更大)。
**代码块:**
```python
def insert(self, value):
"""插入一个新元素到堆中。
参数:
value: 要插入的新元素。
"""
# 将新元素添加到数组末尾
self.array.append(value)
# 从新元素的父节点开始比较和交换
i = len(self.array) - 1
while i > 0:
parent = (i - 1) // 2
if self.array[i] < self.array[parent]: # 小顶堆
self.array[i], self.array[parent] = self.array[parent], self.array[i]
i = parent
```
**逻辑分析:**
* `insert()` 函数接收一个 `value` 参数,表示要插入的新元素。
* 将 `value` 添加到数组的末尾,然后从新元素的父节点开始比较和交换。
* 比较新元素与父节点的值,如果新元素更小(小顶堆),则交换两个元素。
* 重复比较和交换过程,直到新元素到达根节点或其父节点的值更小。
**删除操作**
删除操作从堆中删除根节点,并保持堆的性质。删除操作的步骤如下:
1. 将数组中最后一个元素(叶节点)移动到根节点。
2. 从根节点开始,与较小的子节点(小顶堆)比较,如果子节点更小,则交换两个元素。
3. 重复步骤 2,直到根节点的值比其子节点都小(或大)。
**代码块:**
```python
def delete(self):
"""删除堆中的根节点。"""
# 将最后一个元素移动到根节点
self.array[0] = self.array.pop()
# 从根节点开始比较和交换
i = 0
while i < len(self.array):
left = 2 * i + 1
right = 2 * i + 2
# 找到较小的子节点
smaller = i
if left < len(self.array) and self.array[left] < self.array[smaller]:
smaller = left
if right < len(self.array) and self.array[right] < self.array[smaller]:
smaller = right
# 如果根节点的值大于较小的子节点,则交换两个元素
if i !
```
0
0