今天看了几篇讲堆排序的博客,感觉没有把堆排序的思想讲清楚,现梳理一下思路。
堆的定义
-
堆是一颗完全二叉树
-
以最小堆为例:在一颗树中,其根节点的值小于其子树的任意结点的值,这个条件对于这棵树的任意子树也成立,就称这棵树为最小堆。最大堆相反。
-
我们可以利用数组存储堆,即根节点对应arr[0],其子节点从左至右依次排序。
-
下图即为一个最小堆(圆圈外为数组索引,圆圈内为值)
堆排序思想(以升序为例)
- 若是要以升序排序,我们希望数组中最后一个元素为整个数组中的最大值。那么我们就可以借用堆的构造,因为最大堆中的根节点是整个树中最大的元素。
第一步:我们可以使用最大堆的构造方法使用数组元素构造出一个最大堆
第二步:然后将最大堆的根结点与数组中最后一个元素交换位置(此时数组中最后的元素为最大值)
第三步:忽略最后一个元素,将数组中第一个元素到倒数第二个元素再次构造最大堆
第四步:将其根节点与数组元素中的倒数第二个元素交换位置(此时数组最后的元素为最大值,倒数第二个元素为次大值)
…
…
最终得到的数组为升序排列