1.堆:具备两个附加属性的一颗二叉树,它是一颗彻底二叉树,对每一结点,它小于或等于其左右孩子(或大于等于其左右孩子)数组
2.最小堆:对每一结点,它小于或等于其左右孩子,将其最小元素存储在二叉树的根处,且其根的两个孩子一样也是最小堆
网络3.最大堆:对每一结点,它大于或等于其左右孩子,将其最大元素存储在二叉树的根处,且其根的两个孩子一样也是最大堆数据结构
操做 说明 addElement 往堆的合适位置添加一个元素 removeElement 从堆中删除一个元素 removeAllOccurrences 从堆中删除所指定元素的任何存在 removeMin 删除堆中的最小元素并返回它 removeMax 删除树堆的最大元素并返回它 findMin 返回一个指向堆中最小元素的引用 findMax 返回一个指向堆中最大元素的引用
1.优先级队列就是遵循两个排序规则的集合:具备更高优先级的项目在;具备相同优先级的项目使用先进先出方法来肯定其排序学习
2.优先级队列具备多种应用(好比,操做系统中的任务调度,网络中的通讯调度,甚至是汽车维修处的做业调度)字体
3.能够使用某一队列列表(其中每一队列都表示了给定优先级的项目)来实现一个优先级队列操作系统
4.按照优先级对堆排序完成了第一次排序(高优先级的项目在先)。可是,咱们必须对具备相同优先级项目的先进先出排序进行操纵:
解决方案是建立一个 PriorityQueueNode对象,它存储的是将被放置在队列中的元素,该元素的优先级,以及元素放进队列的顺序
而后,咱们只需为 PriorityNode类定义个 compareTo方法,以便先对优先级进行比较,而后在优先级同样的时候再对阶进行比较设计
1.列表实现堆:堆的链表实现要求在插入元素后可以向上遍历该树,因此堆中的结点必须存储指向其双亲的指针。指针
2.数组实现堆:树的根位于位置0,对于每一结点n,n的左孩子将位于数组的2n+1位置处,n的右孩子将位于数组的2(n+1)位置处(反过来一样也是对的)
对于任何除了根以外的结点n,n的双亲位于(n-1)/2位置处,由于咱们可以计算双亲和孩子的位置,因此与链表实现不一样的是,数组实现不须要建立一个 Heap Node类调试
1.使用堆来对某个数字列表进行排序:将列表的每一元素添加到堆中,而后次一个地将它们从根中删除,在最小堆的情形下,排序结果将是该列表以升序排列;在最大堆的情形下,排序结果将是该列表以降序排列。code
2.因为添加和删除操做的复杂度都为O(log n),所以能够得出堆排序的复杂度也是O(log n),可是,这些操做的复杂度为O(log n)指的是在含有n个元素的列表中添加和删除一个元素。
问题1:无