public class Heap { private boolean maxheap; // true => maxheap, false => minheap private static final int MAXSIZE = 100; private Order[] array = new Order[MAXSIZE]; private int size = 0; private int maxsize = MAXSIZE - 1; public Heap(boolean maxheap) { this.maxheap = maxheap; } public int size() { return size; } public void put(Order order) { // add new element at end, restore heap int i; if (size < maxsize) { i = ++size; if (maxheap) while ((i > 1) && (array[i/2].PRICE < order.PRICE)) { // i/2 is the parent array[i] = array[i/2]; i /= 2; // i becomes the parent } else while ((i > 1) && (array[i/2].PRICE > order.PRICE)) { array[i] = array[i/2]; i /= 2; } array[i] = order; } } public Order testRoot() { // retrieve root if (size == 0) return null; else return (array[1]); } public Order getRoot() { // retrieve root, remove root, restore heap if (size == 0) return null; else { Order root = array[1]; Order last_element = array[size--]; int i = 1; while (2*i <= size) { // 2*i is left child int child = 2*i; if (child != size) // find smaller child if (maxheap) { if (array[child+1].PRICE > array[child].PRICE) // child+1 is right child child++; } else if (array[child+1].PRICE < array[child].PRICE) child++; if (maxheap) { if (last_element.PRICE < array[child].PRICE) // percolate one level array[i] = array[child]; else break; } else if (last_element.PRICE > array[child].PRICE) array[i] = array[child]; else break; i = child; } array[i] = last_element; return(root); } } }