介绍
分析
基本思想:
- 将无需的数据构成堆(即用无序数据生成满足堆定义的完全二叉树)
- 利用堆排序(即将上一步生成的堆输出,得到排序后的有序数据)
算法描述:
构成堆
- 将无序数据放入完全二叉树的各节点 
- 由二叉树的下层向上层逐层进行父子节点的数据比较,使用一种称为“筛”的运算进行节点数据的调整,直到使节点最后满足堆的条件为止(针对非叶节点) - 2.1 确定Ai的两个子树的最大值,放在Aj中 - 2.2 将Ai的数据与Aj的数据进行比较,如果Ai>=Aj,表示Aj为根的子树已构成堆,筛运算完成 - 2.3 若Ai<Aj,则将Ai与Aj互换位置,互换位置后可能会破坏以Ai(此时Ai的值为原来的Aj)为根的堆,接着再以Aj为根重复前面的步骤,直到父节点数据大于子节点,或子节点为空时为止 
堆排序
- 取堆的根节点(最大值),将其放到数组的最后
- 重新执行前面介绍的构成堆的方法,最后一个节点排除在外
- 重复上面过程,直到只剩下一个节点,即可得到有序的数据




C实现
| 1 | /** | 
Swift实现
| 1 | class HeapSort { | 
总结
时间复杂度:
- 最差O(nlogn)
- 最优O(nlogn)
- 平均O(nlogn)
空间复杂度:
- O(1)
稳定性:
- 不稳定