关于堆排序的过程,有兴趣可以看看
小羋 2019-06-18 05:32:46 3 1 2 4 5
构建开始,一般构建树都是从中间开始,也就是线性表长除以二。根据完全二叉树的性质,左子女结点为双亲结点的下标的两倍,那么可以得到右子女结点为双亲结点的两倍加一。
取出双亲结点的值。
4是1的左孩子,等等不要急比较,先看看左孩子和右孩子的大小,左孩子为4那么这个右孩子就是5,4比5小,移动到右孩子上,加一。然后再比比双亲结点和左孩子,此时右孩子赫然是5,双亲结点为1。比双亲结点大,把它赋给双亲结点,因为此时5已经是最后一个,乘于二大于线性表长度,也就是说它没有孩子,跳出。把取的值赋给5这个值的位置。
此时排列为3 5 2 4 1
然后下标向前移一个,到了3这个位置。同样取值,3的子女结点的下标位置为2,那么就是5了。依照前面的,比较一下右兄弟结点。比他大,移位!然后再和取出的值比较一下,5比3大,赋给双亲结点!
此时还没完,我们需要调整一下后面的元素,确保其满足大顶堆的定义(因为左孩子还有孩子,且左孩子可能比双亲结点大,必须要有这样可能的思维,不能用眼睛看,遇到大数据怎么办?)。继续构建。
此时把上一次的的左孩子值看成取出的值,它的左孩子结点为4,比较一下两兄弟,4比1大不移位。不移,就比较一下取的值(也就是此时双亲结点的值),比双亲结点大,把值赋给双亲结点。这会儿终于没了孩子,到了叶节点上。把取的值那过来赋给这个叶结点,完工。
此时堆构建完成。
5 4 2 3 1
我们可以发现最前面一个的元素值最大,输出它输出之后,和1交换位置,把它放在后面,(代表已经把这个结点从堆里删除了)。
堆的序列为1 4 2 3
此时的堆顶是不符合大顶堆的构造,那么我们需要调整堆。
注意此时堆里没有5!
1 4 2 3
怎么调整呢?
记住,我们之前已经做过了构建大顶堆,我们就可以利用,先前的步骤来调整,不过我们这次是从第一个开始。
取值
1这个堆顶的左孩子我们很容易可以看到是4。与之前步骤一般,比比左右两孩子。4比2大,不移。左孩子与取的值比一比,大于,把左孩子的值赋给双亲结点。因为左孩子还有孩子(不要忘了那个可能),继续。
此时把上一次的的左孩子值看成取出的值,它的左孩子结点为3,没有右孩子。就比较一下取的值,(也就是此时双亲结点的值),比双亲结点大,把值赋给双亲结点。这会儿终于没了孩子,到了叶节点上。把取的值那过来赋给这个叶结点,完工。
4 3 2 1
接下来输出堆顶数,交换,删除。
堆的序列为1 3 2
下面的相信你自己也会模拟了,祝你好运