赞
踩
优先级队列是由一组元素组成的集合,每个元素都有一个相关的优先级,优先级高的元素先出队列。
具体来说,一个优先级队列应该支持以下操作:
在优先级队列中,元素的优先级决定了它们在队列中的顺序,在删除最高优先级元素后,要确保队列中剩余元素按照优先级排序。
JDK1.8
中的PriorityQueue
(Java中的优先级队列)底层使用了堆这个数据结构,堆就是在完全二叉树的基础之上进行了一些元素的调整。
堆是一种完全二叉树,其中每个节点的值都不小于(或不大于)其子节点的值。堆分为两种类型:
堆是一棵完全二叉树,因此可以按层序序列的方式用数组来存储,这样比较高效。而非完全二叉树就不适用数组来存储:
完全二叉树能充分地利用空间。
重要性质:
iii 表示数组的下标,nnn 表示树的总节点数:
这些性质非常重要,请大家熟记。
我们已经熟悉了堆的一些性质,那么我们就开始来创建一个堆,由于堆是一棵:每个节点的值都不小于(或不大于)其子节点的值完全二叉树,所以要想创建一个堆,我们就得把一个序列(完全二叉树)调整为前面性质的完全二叉树。
给定一棵完全二叉树:{27,15,19,18,28,34,65,49,25,37},现在要求调整为一个大根堆(每个节点的值都大于子节点的值)。
(注意:把一棵完全二叉树调整为大根堆或小根堆 都是用向下调整法,这里以大根堆为例)
原图:
怎么调整?
动图:
我们来模拟实现堆。
建堆:
- public class MyHeap {
-
- public int[] data;
-
- public int usedSize;//有效的数据个数
-
- public MyHeap(){
- data = new int[10];
- }
-
- //通过传递数组的方式初始化data
- public void initData(int[] arr){
- this.data = Arrays.copyOf(arr,arr.length);
- usedSize = arr.length;
- }
-
-
- //打印这个堆
- public void print(){
- for (int i = 0; i < usedSize; i++) {
- System.out.print(data[i] + " ");
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。