二、小顶堆

- Timer和定时任务线程池用的都是基于小顶堆
 - 后面的quartz以及更高级的是基于时间轮算法
 
2.1 堆

- 堆是一颗完全二叉树

 - 完全二叉树:除了最后一层外,其他层都达到最大节点数,且最后一层节点都靠左排列。

 - 小顶堆:最小值在上面
 - 大顶堆:最大值在上面
 - 要掌握:堆的,存,取 
  
- 存的话,java有两种:数组和列表【这里选用的数组的方式】
 
 

- 堆插入数组的原则:从上到下,从左向右。
 - 查询不方便,所以数组下标0的位置不放数字。
 - 这样的好处是查询父节点方便,只需要用子节点的下标/2即可。
 - 注:每一个节点存的是一个Job,Job的值就包含了触发时间(所以越靠前触发时间越近)。
 
2.2 插入元素[插入尾部,然后上浮]

- 记住一句话:插入尾部,然后上浮就可以了【上浮下沉还有个词叫:堆化】
 - 插入尾部:就避免了插到头部数组的整体移动问题
 - 然后上浮:和他的父节点比,如果小于父节点就替换。迭代向上走


 
2.3 删除堆顶元素[将尾部(最大的元素)元素放到堆顶,然后下沉]
- 删除只能取堆顶元素
 

- 记住这句话就行了:将尾部(最大的元素)元素放到堆顶,然后下沉【上浮下沉还有个词叫:堆化】

 - 比如:将8放到根节点上之后(删除原来的)
 - 然后和比较小的子节点进行交换
 - 继续迭代上面的步骤
 

2.4 以上呢种就是核心下面是了解【建堆,堆排序,总结】

 
 
 
 
 
