堆是一种数据结构,分为最小堆和最大堆,能够用二叉树来表示。数据结构
在二叉树的任意的一个三角结构中(一个父节点,两个子节点),须要知足如下两个条件:spa
一、父节点要是最小的,就是最小堆(或最大的,就是最大堆),两个子节点之间没有要求blog
二、数据插入的顺序是一层一层的,只有上一层存满,才会有下一层排序
下面咱们以图片的形式演示最小堆的插入、取值、和排序操做,只要知道最小堆的原理,那么最大堆也就明白了。图片
假设咱们有一个原始的最小堆以下:原理
当插入一个新值时,首先将值放到树的最后的位置,以下图所示。二叉树
而后将这个值与父元素比较,若是不知足规则1,则与父元素替换(以下图所示)。im
第一步数据
第二步db
第三步
由图可知,在插入操做中,交换次数最大即为树的高度(log n)
在最小堆中,拿出一个最小值,固然就是拿出第一个数啦~不过拿完之后树不就没有“头”了?
不用担忧,咱们能够把最后一个数放到头的位置,这样树的结构就不会改变,并且操做简单(由于是最后一个数)。
固然,由于是最后一个数,必然会出现不知足条件1的状况,因此咱们须要把新的树头与子元素比较替换,下面是图片演示:
假设咱们有一个原始的最小堆以下所示,接下来咱们要取最小值:
不过交换完极可能是不知足条件1的,那么咱们就须要比较替换,替换规则是和两个子元素中最小的一个替换
由图可知,在取值操做中,交换次数最大也为树的高度(log n)
咱们知道了如何取最小值,那么堆的排序简单啦~只要依次取堆的最小值,那么当堆取完时,咱们取出的数据不就是一个从小到大的序列嘛!