1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| package com;
public class MinPriorityQueue<T extends Comparable<T>> {
private T[] data;
private int minPriorityQueueLength;
MinPriorityQueue() {
}
public int size() { return minPriorityQueueLength; }
public boolean isEmpty() { return minPriorityQueueLength==0; }
private boolean less(int i, int j){ return data[i].compareTo(data[j])<0; }
private void exch(int i, int j) { T tmp = data[i]; data[i] = data[j]; data[j] = tmp; }
public void insert(T t) { data[++minPriorityQueueLength] = t; swim(minPriorityQueueLength); }
public T delMim() { T min = data[1]; exch(1, minPriorityQueueLength); minPriorityQueueLength--; sink(1); return min; }
private void swim(int k) { while (k>1) { if (less(k, k/2)) { exch(k, k/2); }
k = k/2; } }
private void sink(int k) { while (2*k<=minPriorityQueueLength) { int min; if (2*k+1<=minPriorityQueueLength) { if (less(2*k, 2*k+1)) { min = 2*k; } else { min = 2*k+1; } } else { min = 2*k; }
if (less(k, min)) { break; }
exch(k, min);
k = min; } }
}
|