优先队列的实现(最小堆)
使用最小堆实现优先队列
定义上浮函数和下浮函数,对每一次加入的新节点,重新维护最小堆
代码:
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()); } } }