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();
}
}
|