CS3343/3341 Analysis of Algorithms Spring 2012 |
Priority Queue
|
Priority Queue | |
---|---|
// PQueue.java: priority queue public class PQueue { private final int qsize; private double[] A; private int heapsize = 0; public PQueue(int s) { qsize = s; A = new double[qsize]; } public int qSize() { return heapsize; } public double heapMaximum() { if (heapsize < 1) { System.out.println("Empty Queue"); System.exit(0); } return A[1]; } public double heapExtractMax() { if (heapsize < 1) { System.out.println("Heap Underflow"); System.exit(0); } double max = A[1]; A[1] = A[heapsize]; heapsize--; maxHeapify(1); return max; } private int parent(int i) { return i/2; } private int left (int i) { return 2*i; } private int right (int i) { return 2*i + 1; } private void exchange(int i, int largest) { double temp = A[i]; A[i] = A[largest]; A[largest] = temp; } private void maxHeapify(int i) { int l = left(i); int r = right(i); int largest; if (l <= heapsize && A[l] > A[i]) largest = l; else largest = i; if (r <= heapsize && A[r] > A[largest]) largest = r; if (largest != i) { exchange(i, largest); maxHeapify(largest); } } public void maxHeapInsert(double key) { if (heapsize >= qsize - 1) { System.out.println("Heap Overflow"); System.exit(1); } heapsize++; A[heapsize] = -1.0e100; heapIncreaseKey(heapsize, key); } void heapIncreaseKey(int i, double key) { if (key < A[i]) { System.out.println("New key < Current key"); System.exit(2); } A[i] = key; while (i > 1 && A[parent(i)] < A[i]) { exchange(i, parent(i)); i = parent(i); } } public void printheap() { System.out.println("Dump of queue, heapsize:" + heapsize); for (int i = 1; i <= A.length - 1; i++) { System.out.println(i + ": " + A[i]); } System.out.println(); } } | // PqueueTest.java: sort array of random #s import java.util.*; public class PQueueTest { private Random r; private PQueue pQueue; private int size; public PQueueTest(int size) { r = new Random(314159265); pQueue = new PQueue(size); } public void randomTest() { for (int i = 0; i < 4; i++) { double ran = r.nextDouble(); pQueue.maxHeapInsert(ran); System.out.println("Inserted: " + ran); pQueue.printheap(); } for (int i = 0; i < 5; i++) { double x = pQueue.heapExtractMax(); System.out.print("Extracted: "+x+", "); System.out.println("heapsize: " + pQueue.qSize()); } } public static void main(String[] args) { final int SIZE = 5; PQueueTest pq = new PQueueTest(SIZE); pq.randomTest(); } } |