最近对排序算法仔细研究之后,发现对于堆排的理解不够深刻,所以研究一段时候后,特来总结一下。
堆排原理
堆排序见名知意就是在堆中就行排序,利用堆的特性来排序,所以我们就先要知道,堆是什么?
堆最直观的理解是完全二叉树(这里要区别和满二叉树的区别),这里要区别于平衡二叉树,堆只要求子节点小于或大于父节点(这里大小根据需求是大根堆还是小根堆决定),对左右节点大小没有要求(堆的特点)。
现在我们对堆有了大概的了解,然后我们在了解一下,堆的操作
堆底层通过数组实现,所以我们插入新元素都是尾插,注意的是插入完成后要调整堆,使其满足堆的大小特点。同理删除也是,我们一般都是头删,当然也可以删除任意元素,删除后的处理是将最后一个元素,赋值给被删除的元素,再调整堆。一般根据需求堆可以分为大根堆和下根堆,区别在于父节点大于还是小于子节点,大于就是大根堆,小于就是小根堆。
图解堆排

以上图数据为列我们来讲解,首先我们先根据下标转换成堆的样子

第一步,我们需要建堆,我们以大根堆为例子,这里需要从最后一个叶子节点的父节点,然后依次递减遍历,这样可以保证每个元素都比较一次,而且次数最少。

本文详细介绍了堆排序的原理,包括堆的定义、操作以及如何构建堆。通过图解方式展示了堆排序的过程,并且讲解了从建堆到完成排序的核心步骤。此外,还提供了堆排序的代码讲解,帮助读者深入理解这一排序算法。
最低0.47元/天 解锁文章
1591

被折叠的 条评论
为什么被折叠?



