完全二叉树:
满二叉树(完全二叉树的一种)
比较典型的完全二叉树(叶子节点必须从左往右排列)
大根堆(堆就是完全二叉树)
所有子树的根节点大于它下面所有的节点
小根堆
所有子树的根节点都小于它的所有的节点
完全二叉树可以用数组表示,arr[]
假如当前节点在数组中以arr【i】代表,则它的左子节点为arr【2i + 1】,右子节点为arr【2i + 2】
求当前节点父节点(i)在数组中的索引 :( i - 1 ) / 2。
建立大根堆
当堆的节点发生变化时,堆的调整过程(heapify)
堆排序
应用:
有海量数据,不断吐出数字,每吐出一个数字,要计算出已经吐出的数字的中位数。
使用一个数组记录,有新数字进入再使用快速排序排列的话,每吐出一个数字,就要付出O(Nlog(N))的代价排序。
当使用大根堆小根堆进行接收,每次吐出数字,堆进行调整的代价仅为O(logN),大根堆装较小的数,小根堆装较大的数。当吐出的数大于小根堆的根节点,就去小根堆。吐出的数字小于大根堆的根节点,去大根堆。当两个堆的heapsize差值大于1,从较大的那个堆吐出根节点到另一个堆。