2.4 优先队列(二叉堆)
简介:可以删除最大元素和插入元素
特点:高效(对数级别的)删除最大元素和插入元素操作
public class PriorityHeap {
//小顶堆
//Instance Variables
int[] arr;
int size;
//Constructors
//堆的大小默认为64
public PriorityHeap() {
this(64);
}
public PriorityHeap(int initSize) {
super();
this.arr =new int[initSize];
this.size = 0;
}
//获取最小的元素
public int min() {
return arr[0];
}
//删除最小的元素
public int pop() {
int res=arr[0];
arr[0]=arr[--size];
sink(0);
return res;
}
public void add(int data) {
arr[size++]=data;
swim(size-1);
}
private void sink(int i) {
//当列表第一个是以下标0开始,结点下标为i,左孩子则为2*i+1,右孩子下标则为2*i+2;
//若下标以1开始,左孩子则为2*i,右孩子则为2*i+1
while(2*i+1<=size-1) {
int j=2*i+1; //j表示左孩子的下标
//如果右孩子小于左孩子
if(j<size-1&&this.arr[j]>
this.arr[j+1]) {
j++;
}
if(this.arr[i]<=this.arr[j]) {
break;
}
//当左右孩子的最小值小于父节点时,则交换
exch(i,j);
i=j;
}
}
private void swim(int i) {
while (i > 0) {
int parent = i / 2;
if (this.arr[i] >= this.arr[parent]) {
break;
}
exch(i, parent);
i = parent;
}
}
private void exch(int a,int b) {
int t=this.arr[a];
this.arr[a]=this.arr[b];
this.arr[b]=t;
}
public static void main(String[] args) {
PriorityHeap heap=new PriorityHeap();
int[] arr= {5,6,9,8,7,2,10,56,21,64,11};
for (int i : arr) {
heap.add(i);
}
int n=heap.size;
//依次输出最小值
for(int i=0;i<n;i++) {
System.out.print(heap.pop()+" ");
}
}
}