前言
由于博主目前还没有系统学习到二叉树相关的知识,所以有关完全二叉树的概念尽量不会提到。
下文会尝试用最最简单,最容易理解的方式进行描述。
堆排序的思想核心
前面提到的基础排序算法,他们都有一个缺点,没有把每一次的比较结果保存下来,这就导致了后续会进行重复的比较工作。
工作流程:
-
构建一个堆的结构;
-
找到堆内最大或者最小值,将其移走;
-
剩余的元素又组成一个新的堆。
-
循环往复,得到有序的记录。
堆
先来看看堆长什么样子
这就是堆,
其中最底下的结点10、16、4这样的没有孩子结点的,称为叶子结点。
而那些有孩子结点的,称为非叶子结点。
如果n个元素的序列{a1, a2, a3,an} 满足下述条件,就称为堆。
构建堆的关键点
我们需要知道从哪里开始构建堆,就好像组织活动一样,我们需要先找到一个管理者,才能开始组织。
所以我们需要找到第一个非叶子结点,因为它有孩子结点,可以迅速组织起来架构。
哪一个才是第一个非叶子结点呢?
如果是大根堆,则应该从下往上,从右往左找!
代码实现
package heapSort
import "fmt"