优先级队列PriorityQueue
也就是二叉堆是一种完全二叉树用数组进行存储因为优先级队列的存储是层序遍历所以按数组的顺序编号手动创建优先级队列创建大根堆对创建好的大根堆进行插入删除public class TNode { int[] arrays; int usesize; TNode(){} TNode(int[] arrays){ this.arraysarrays; usesizethis.arrays.length; } public void print(){ for(int i0;iusesize;i){ System.out.println(arrays[i]); } } public void createpriorityqueue(int[] arr){ for(int iusesize/ 2 - 1;i0;i--){ sifdowm(arr,i); } } //向下调整操作 public void sifdowm(int[] arr,int p){ //1.获取孩子节点比较左右孩子的大小 int childindexp*21; while(childindexusesizepusesize) { if ((childindex1)usesizearr[childindex] arr[childindex 1]) { childindex; } //2.将左右孩子的最大值与根节点比较交换 if (arr[childindex]arr[p]) { break; } int h arr[p]; arr[p] arr[childindex]; arr[childindex] h; //3.查看左右子树是否需要再次调整 pchildindex; childindex2*p1; } } public void indert(int value){ if(arrays.lengthusesize){ int newsizearrays.length*2; int[] newArraysnew int[newsize]; System.arraycopy(arrays,0,newArrays,0,usesize); arraysnewArrays; } arrays[usesize]value; sifup(arrays,usesize); usesize; } void sifup(int[] arr,int c){ //循环比较与父节点的大小进行交换 int p(c-1)/2; while(c0){ p(c-1)/2; if(arr[c]arr[p]){ break; } int temparr[c]; arr[c]arr[p]; arr[p]temp; cp; } } public void cut(int p){ if (p 0 || p usesize) return; //先与最后一个节点进行交换 int temparrays[p]; arrays[p]arrays[usesize-1]; usesize--; if (p usesize) { sifdowm(arrays, p); // 注意sifdowm 需要知道当前堆大小 usesize } } public static void main(String[] args) { int[] arr{8,5,7,9,4}; TNode tnew TNode(arr); t.createpriorityqueue(t.arrays); // t.print(); t.indert(11); t.cut(0); t.print(); } }优先级队列的直接使用优先级队列中所存储元素的要求必须是能够比较大小的对象且优先级队列默认为小根堆。接下来是优先级队列的常用构造方法PriorityQueue()默认构造器下的优先级队列数组的长度会被默认传入数值11比较器为null如果超过数组长度会自行扩容如果小于641.5倍扩容大于642倍扩容PriorityQueue(int capacity)传入数值初始化数组长度PriorityQueue(new ...)如果要从小根堆变为大根堆需要自定义一个Comparater比较器写一个方法继承Comparater接口重写比较方法再new一个方法对象传入优先级队列就可以将小根堆改写为大根堆class Incmp implements ComparaterInteger(){ Override public int compare(Integer o1,Integer o2){ o2-o1; } }对于优先级队列的常用方法和队列是一样的boolean offer(E e)添加元素E poll()将队头元素抛出并返回E peek()获取队头元素不抛出int size()返回优先级队列元素个数void clear()清除优先级队列元素boolean isEmpty()判断优先级队列是否为空