第六章主要介绍堆排序以及其最坏情况的算法复杂度分析, 第一节首先是关于堆的介绍
堆的介绍
堆的定义
原版算法导论对堆的定义如下:
The (binary) heap data structure is an array object that we can view as a nearly complete binary tree.
这里第一次看很奇怪, 为什么用 nearly complete binary tree, 这个为什么在完全二叉树加了个nearly. 下面紧跟着如下描述
The tree is completely filled on all levels except possibly the lowest, which is filled from the left up to a point.
所以这个实际上和完全二叉树是一个东西. 查了查AI, 一个解释是在国外教材似乎是加个nearly 来强调完全二叉树和满二叉树的区别.
完全二叉树中文定义如下:
完全二叉树是指一棵二叉树中,除了最后一层以外,其余每一层的节点数都达到最大值,并且最后一层的所有节点都集中在最左侧连续的位置上.
直接上图:
满二叉树: 是完全二叉树的特例
A
/ \
B C
/ \ / \
D E F G
完全二叉树
A
/ \
B C
/ \ / \
D E F
下面这个不是完全二叉树, 因为最后一层不左连续
A
/ \
B C
/ \
D E
因为左连续性, 完全二叉树可以直接用数组表示, 如上面第二个, 可表示为
[A, B, C, D, E, F]
而最后一个因为没有左连续性, 直接使用一个数组表示会产生歧义.
在排序问题中, 我们会将数组和堆的节点构建一一映射, 利用堆结构进行排序. 在此之前, 我们需要简单介绍一下堆的进一步的基本概念.
- 最大堆 (max heap): 节点数据满足最大堆关系的堆.
- 最小堆 (min heap): 节点数据满足最小堆关系的堆.
- 最大堆关系 (max heap property): 堆中的每个节点的值 \(\geq\) 子节点的值.
- 最小堆关系 (min heap property): 堆中的每个节点的值 \(\leq\) 子节点的值.
显然, 根据定义, 对于最小堆, 其中最小元素位于根节点. 对于最大堆, 其中最大元素位于根节点.
-
堆的高度 根节点到最深叶子节点的最长路径上的边数 (简单一点就是节点层数-1), 或者 \(height = [log_2 n]\)
-
给定一个索引
i, 其父节点索引[(i-1)/2]. -
给定一个索引
i, 其左子节点索引为2*i + 1, 右子节点索引为2*i + 2.
在本书中, 后续会使用堆来进行排序, 以及优先队列数据结构.
浙公网安备 33010602011771号