提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1.优先级队列(PriorityQueue)
PriorityQueue的特性
Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue。关于PriorityQueue的使用要注意:
- 使用时必须导入PriorityQueue所在的包,即
import java.util.PriorityQueue;
- PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常
- 不能插入null对象,否则会抛出NullPointerException
- 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
- 插入和删除元素的时间复杂度为 O ( l o g 2 N ) O(log_2N) O(log2N)
- PriorityQueue底层使用了堆数据结构,
PriorityQueue的一些常用函数 功能介绍
PriorityQueue() 创建一个空的优先级队列,默认容量是11
PriorityQueue(int initialCapacity) 创建一个初始容量为initialCapacity的优先级队列,
注意:initialCapacity不能小于1,否则会抛IllegalArgumentException异常
PriorityQueue(Collection<?extends E> c) 用一个集合来创建优先级队列
boolean offer(E e)
插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException
异常,时间复杂度
O
(
l
o
g
2
N
)
O(log_2N)
O(log2N),注意:空间不够时候会进行扩容
E peek() 获取优先级最高的元素,如果优先级队列为空,返回null
E poll() 移除优先级最高的元素并返回,如果优先级队列为空,返回null
int size() 获取有效元素的个数
void clear() 清空
boolean isEmpty() 检测优先级队列是否为空,空返回true
简单使用
import java.util.PriorityQueue;
public class TestPQ {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(20);
priorityQueue.offer(3);
priorityQueue.offer(9);
priorityQueue.offer(2);
priorityQueue.offer(5);
priorityQueue.offer(7);
priorityQueue.offer(1);
System.out.println(priorityQueue.peek());
System.out.println(priorityQueue);
priorityQueue.poll();
System.out.println(priorityQueue);
}
}
2.实现自己的优先级队列
创建堆
public MyPQ createUp(int[] array,int size) {
//从左右孩子节点不为空的节点开始换,直接找到最后一个节点的父节点。
//从下往上依次来进行更换
for (int i = 0; i <= size-1; i++) {
shiftUp(array, i);
}
MyPQ pq = new MyPQ(array,array.length);
return pq;
}
插入堆
public void offer(int val){
if(size >= Max){
realloc();
}
data[size] = val;
size++;
createUp(data,size);
}
取堆顶元素
public Integer peek(){
if(size <= 0){
return null;
}
return data[0];
}
删除堆顶元素
public void poll(){
if(size <=0){
return;
}
data[0] = data[size-1];
size--;
shiftDown(data,size,0);
}
测试程序
public static void main(String[] args) {
int[] arr = new int[]{9,5,6,4,10,11,23,8};
MyPQ pq = new MyPQ(arr,arr.length);
System.out.println("变成堆之前"+ Arrays.toString(arr));
System.out.println("编程堆之后"+pq.createUp(arr,arr.length));
//插入
pq.offer(3);
System.out.println("插入之后"+pq);
System.out.println("取堆顶元素"+pq.peek());
pq.poll();
System.out.println("删除堆顶元素之后"+pq);
}
备注
向下调整,向上调整,在我的其他博客里面已经写到了,这就不再写了。