堆排序图解

224 阅读2分钟

本文接《六种常用的数列排序算法图解(上)》,用图解的方式对堆排序做详细的解说。

堆排序

堆排序树数列排序的算法之一,其特点是利用堆堆数据结构。接下来讲解对5、2、7、3、6、1、4进行排序。

堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

第一阶段 入堆

把所有数字储存进堆中

image.png

第一步、第二步如上图所示。咱们移动了52,按照子结点的键值总是小于父节点进行操作。

image.png

第三步移动75的右子树,因为7不小于5,遵循子结点的键值总是小于父节点,接下来第四步75的位置交换。

image.png

遵循子结点的键值总是小于父节点,第五步和第六步把3移动到2的左节点后,因为32大,所以接下来32互换位置。

image.png 接下来,继续遵循子结点的键值总是小于父节点,把剩下的14也放进二叉树中。

image.png 经历了10步操作,到目前为止,所有的数字已储存在堆中。

第二阶段 出堆

逐个取出储存在堆中的数字 降堆的一个特性是数据将从大到小取出,将取出来的数字按相反的顺序排列,数字将完成排序。

image.png

把顶部最大的7取出,叶结点4移动到根节点。

image.png

遵循子结点的键值总是小于父节点46互换。

image.png

接着取出6,叶结点1移动到根节点。接着遵循子结点的键值总是小于父节点1与最大子节点5交换。

image.png 重复以上操作,不断取出根节点到数列,然后叶子节点移动到根节点,并遵循子结点的键值总是小于父节点调整堆,直到把所有数字从堆中取出。

image.png

...

所有的数字都从堆中取出,排序完成:1,2,3,4,5,6,7

总结

堆排序主要分入堆出堆两个阶段,入堆阶段根据最大堆最小堆的原则,对数列完成堆的转变。然后再根据最大堆或最小堆的原则,操作出堆完成对数列的排序。