数据结构——堆,小顶堆,大顶堆,堆排序

1.简介

 堆是什么?堆是一种特殊的完全二叉树,就像下面这棵树一样:

这棵树有一个很显著的特点,那就是所有父结点都要比子结点要小。符合这样要求的完全二叉树我们成为“最小堆”。反之,如果所有父结点都要比子结点大,这样的完全二叉树被称为”最大堆“。

2.下移ShiftDown

如果我们现在要删除掉最小的数字,并重新插入一个数字,再从中找出最小的数字。目前只能够先扫描所有的数字,找到最小的数,插入新的数字后再扫描所有的数字。这样子的时间复杂复是O(N²),那么有没有更好的方法呢?”堆“的结构恰好能够很好地解决了这个问题。

首先将数字按照最小堆的要求放进一颗完全二叉树,就像下面这棵树一样。然后用数组h存储这些数字。

很显然最小的数就在堆顶,假设存储这个堆的数组是h,那么最小的数字就是h[1]。接下来将堆顶的数字删除。将新增的数字28放入堆顶。此时显然不满足小顶堆的特性,我们需要将新增的数字调整到合适的位置。如何调整呢?

向下调整!我们需要将这个数字与它的两个儿子2和5比较,选择较小的一个和它交换,交换之后如下:

我们发现此时还是不符合最小堆的特性,因此还需要继续向下调整。于是继续将28与两个儿子12和7比较,选择较小的一个进行交换

此时还是不满足,继续向下调整:

现在我们已经找到符合最小堆的特性了。综上所述,当新增加一个数被放到顶堆时候,如果发现不符合最小堆的特性ÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值