使用最小堆实现优先队列
定义上浮函数和下浮函数,对每一次加入的新节点,重新维护最小堆
代码:
public class PriorityMinQueue {
private int[] arr;
private int size;
/**
* 返回优先队列的大小
*
* @return
*/
public int Size() {
return size;
}
public PriorityMinQueue() {
this(20);
}
/**
* 初始化优先队列
*
* @param capacity
*/
public PriorityMinQueue(int capacity) {
if (capacity <= 0) {
capacity = 30;
} else {
this.arr = new int[capacity];
this.size = 1;
}
}
/**
* 上浮
*
* @param i
* @param key
*/
public void upFloat(int i) {
while (i > 1) {
int parent = i / 2;
if (this.arr[i] >= this.arr[parent]) {
break;
}
swap(i, parent);
i = parent;
}
}
/**
* 下浮操作
*
* @param i
*/
public void downFloat(int i) {
while (2 * i <= this.size - 1) {
int child = 2 * i;
if (child < this.size - 1 && this.arr[child] > this.arr[child + 1]) {
child++;
}
if (this.arr[i] <= this.arr[child]) {
break;
}
swap(i, child);
i = child;
}
}
/**
* 交换两个数
*
* @param i
* @param parent
*/
private void swap(int i, int parent) {
int tmp = this.arr[parent];
this.arr[parent] = this.arr[i];
this.arr[i] = tmp;
}
/**
* 返回堆中的最大值
* @return
*/
public int Max() {
return this.arr[0];
}
/**
* 向优先队列中添加一个元素
* @param value
*/
public void add(int value) {
resize();
this.arr[size++] = value;
upFloat(size-1);
//
// for(int i=1;i<size;i++) {
// System.out.print(arr[i]+" ");
// }
// System.out.println();
// System.out.println("*********************************");
}
/**
* 重新调整列表容量
*/
private void resize() {
if(size == this.arr.length) {
System.out.println("正在扩容");
int []tmparr = new int[arr.length*2];
for(int i=0;i<size;i++) {
tmparr[i] = arr[i];
}
arr = tmparr;
}
}
/**
* 将优先队列中的最大值弹出
*/
public int pop() {
int t = this.arr[1];
this.arr[1] = this.arr[--size];
downFloat(1);
return t;
}
/**
* 判断优先队列是否为空
* @return
*/
public boolean isEmpty() {
if(size==1) {
return true;
}else {
return false;
}
}
/**
* 返回队列头
* @return
*/
public int front() {
return this.arr[0];
}
public static void main(String[] args) {
PriorityMinQueue minQueue = new PriorityMinQueue();
for(int i=100;i>0;i--) {
minQueue.add(i);
}
while(!minQueue.isEmpty()) {
System.out.println(minQueue.pop());
}
}
}