本文接《六种常用的数列排序算法图解(上)》,用图解的方式对堆排序做详细的解说。
堆排序
堆排序树数列排序的算法之一,其特点是利用堆堆数据结构。接下来讲解对5、2、7、3、6、1、4进行排序。
堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
第一阶段 入堆
把所有数字储存进堆中
第一步、第二步如上图所示。咱们移动了5与2,按照子结点的键值总是小于父节点进行操作。
第三步移动7到5的右子树,因为7不小于5,遵循子结点的键值总是小于父节点,接下来第四步7和5的位置交换。
遵循子结点的键值总是小于父节点,第五步和第六步把3移动到2的左节点后,因为3比2大,所以接下来3与2互换位置。
接下来,继续遵循
子结点的键值总是小于父节点,把剩下的1与4也放进二叉树中。
经历了10步操作,到目前为止,所有的数字已储存在堆中。
第二阶段 出堆
逐个取出储存在堆中的数字
降堆的一个特性是数据将从大到小取出,将取出来的数字按相反的顺序排列,数字将完成排序。
把顶部最大的7取出,叶结点4移动到根节点。
遵循子结点的键值总是小于父节点,4与6互换。
接着取出6,叶结点1移动到根节点。接着遵循子结点的键值总是小于父节点,1与最大子节点5交换。
重复以上操作,不断取出根节点到数列,然后叶子节点移动到根节点,并遵循
子结点的键值总是小于父节点调整堆,直到把所有数字从堆中取出。
...
所有的数字都从堆中取出,排序完成:1,2,3,4,5,6,7。
总结
堆排序主要分入堆和出堆两个阶段,入堆阶段根据最大堆或最小堆的原则,对数列完成堆的转变。然后再根据最大堆或最小堆的原则,操作出堆完成对数列的排序。