堆 分为 大根堆 和 小根堆,均是完全二叉树
大根堆 要求每个内部节点的值大于其左右子节点的值
性质:由最大堆的要求来看,大根堆总能保证根节点是堆中值最大的。
堆排序算法就是根据大根堆的这种性质,
0)初始化二叉树(堆)
1)调整堆使其为全部元素( n个 )的大根堆
2)拿出根节点(n个中最大值),调整剩余的(n-1)个元素使其为大根堆
3)拿出根节点(n-1个中最大值),调整剩余(n-2)个元素使其为大根堆
。。。
。。。
这样,每次拿出的元素都是剩余元素中的最大者,也即拿出的元素在原始数组中
是最大者,次大者,次次大者,。。。这样就完成了排序
【注】
0)初始化的过程个人感觉不是很重要,常见的做法是直接根据广度优先的做法把数组中的元素排列到二叉树中
1)调整堆的过程就是循环遍历所有非叶子节点,调整使其值大于左右子节点,循环之后,形成新的大根堆
相关调整堆的过程参见,堆排序及其分析