目录
概述
在「数组」快速排序 / 随机值优化|小区间插入优化(C++)中,我们介绍了三种基本排序中的冒泡排序与分治思想结合的算法:快速排序。
本文我们来讲第二种基本排序:选择排序与分治思想结合的产物:堆排序。
我们来回想选择排序:每次选出最小的元素放在数组头部位置,每次都扫描一遍整个数组,整体表现为O(n²)。
我们希望只进行少量比较就能得出数组中的最小元素,该怎么做呢?堆这种结构给了我们一点启发。
核心概念:堆
堆是一颗完全二叉树,它的特点是可以用一维数组来储存。
堆结构
在初学数组排序阶段就理解二叉树似乎有些困难,不过好在我们不必完全了解二叉树的所有概念。
我们只需要知道:
①一个堆是一个层状结构,除去最底一层,每层的每个节点都有左子节点和右子节点,层层布满。
节点从上到下,从左到右依次编号。
(对于这样的结构,我们称之为二叉树,每个父节点都有左右孩子指针指向子节点。)

②只有最后一层允许节点不排满,但节点的排布仍然是严格从左到右的。
如下,图一和图二都是堆,但图三不是堆,因为它的最底层排布不是从左到右的。



③堆有两种:小根堆和大根堆。
小根堆要求父节点的值小于它的两个孩子,大根堆要求父节点的值大于它的两个孩子。
*注意*:一个节点的左右孩子之间的大小关系不做任何要求。
我们称二叉树的头结点为根,所以这种命名就很好理解了:小根堆的根最小,大根堆的根最大。
数组存堆
此时此刻我们完全不必知道二叉树的标准结构,因为数组就可以储存堆。
观察:

我们发现,一个序号从0开始的堆结构,

最低0.47元/天 解锁文章
524

被折叠的 条评论
为什么被折叠?



