介绍
分析
基本思想:
- 将无需的数据构成堆(即用无序数据生成满足堆定义的完全二叉树)
- 利用堆排序(即将上一步生成的堆输出,得到排序后的有序数据)
算法描述:
构成堆
将无序数据放入完全二叉树的各节点
由二叉树的下层向上层逐层进行父子节点的数据比较,使用一种称为“筛”的运算进行节点数据的调整,直到使节点最后满足堆的条件为止(针对非叶节点)
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)
稳定性:
- 不稳定