具体代码请看:NDKPractice项目的datastructure36heapsorting
1. 二叉树的序列化和反序列化
1.1 序列化
1 | /** |
1.2 反序列化
1 | /** |
2. 优先级队列
数组转二叉树规律(前提:index 从 1 开始
):
left(左节点) = 父节点角标 2
right(右节点) = 父节点角标 2 + 1
最大堆
:父节点永远比子节点大。最小堆
:父节点永远比子节点小。
1 | template<class E> |
3. 堆排序(升序采用大根堆,降序采用小根堆)
将一个数组想象成一棵完全二叉树:
如果把一个数组排成完全二叉树,则是下标循环时,是从上到下,从左到右
,进行填充
i
的左子节点下标:2*i+1
,如果越界,证明左孩子不存在i
的右子节点下标:2*i+2
,如果越界,证明右孩子不存在i
的父节点下标:(i-1)/2
,注意下标0位置求父节点,(0-1)/2 = 0- 第一个非叶子结点
arr.length/2-1
堆就是一棵完全二叉树。
最大堆
:父节点永远比子节点大。最小堆
:父节点永远比子节点小。思想是:
将待排序序列构造成一个大根堆,此时,整个序列的最大值就是堆顶的根节点。 将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个大根堆,再将堆顶的根节点和最后一个元素n-1交换。如此反复执行,便能得到一个有序序列了
时间复杂度
:O(N*$\log_2 N$)空间复杂度
:O(1)
1 | /** |