最通俗易懂的算法案例解释:排序算法之堆排序_堆排序


从小到大排序: 构造小顶堆

从大到小排序: 构造大顶堆

【注意:只比较和交换相邻的元素】

案例:
对以下数据进行堆排序:【从大到小排序】

19 97 01 08 09 17

答:

把原数据看成一个二叉树:

最通俗易懂的算法案例解释:排序算法之堆排序_数据_02


自底向上一层一层扫描,将节点与左右节点进行比较大小,把大的往上交换第一步:01与17比较:并交换

最通俗易懂的算法案例解释:排序算法之堆排序_二叉树_03


第二步:97、与 08、 09比较:不需要交换

最通俗易懂的算法案例解释:排序算法之堆排序_二叉树_04

第三步:19 与 97 、17 进行比较:

19 < 97所以两个互换

最通俗易懂的算法案例解释:排序算法之堆排序_数据_05


第四部:取数据:取出97,然后把最末尾的移动到根节点位置(即最顶部),然后再次重复第一 ~三步再次构造一个大顶堆。

此时:

最通俗易懂的算法案例解释:排序算法之堆排序_堆排序_06


再次取出堆顶元素,把末尾元素放到堆顶上面去,然后再次构造大顶堆:

最通俗易懂的算法案例解释:排序算法之堆排序_数据_07


再次取出堆顶元素,把末尾元素放到堆顶上面去,然后再次构造大顶堆:

最通俗易懂的算法案例解释:排序算法之堆排序_二叉树_08


再次取出堆顶元素,把末尾元素放到堆顶上面去,然后再次构造大顶堆:

最通俗易懂的算法案例解释:排序算法之堆排序_二叉树_09


再次取出堆顶元素,然后二叉树中只剩下一个元素,直接加入到末尾上:

最通俗易懂的算法案例解释:排序算法之堆排序_二叉树_10


堆排序结束!总结:

最通俗易懂的算法案例解释:排序算法之堆排序_数据_11