I'm studying with book "Introduction to Algorithms" and implemented PriorityQueue without existed Class.
I made a MaxHeap class with Array and made a PriorityQueue with my Heap class.
Actually code is working and refactored code I did my best,
but I'm beginner so I need feedback for anybody.
would you give me a opinion?
public class PriorityQueue {
private Heap heap;
public PriorityQueue(int[] src){
heap = new Heap(src);
}
public int size() {
return heap.size();
}
public int extractMax() throws Exception {
if(heap.size() < 1)
throw new Exception("heap underflow");
int max = heap.get(0);
heap.set(0,heap.get(getLastIndex()));
heap.decrementSize();
MaxHeapify(0);
return max;
}
public int getMaximum() throws Exception {
return heap.get(0);
}
private int getLastIndex(){
return heap.size()-1;
}
public void increaseKey(int idx, int key) throws Exception {
if(idx >= heap.size())
throw new IndexOutOfBoundsException();
if(key < heap.get(idx))
throw new Exception("new key is smaller than exist value");
heap.set(idx,key);
while(idx > 0 && heap.get(heap.getParentIndex(idx)) < heap.get(idx)){
swap(idx, heap.getParentIndex(idx));
idx = heap.getParentIndex(idx);
}
}
public void add(int key) throws Exception {
heap.checkCapacity();
heap.incrementSize();
increaseKey(heap.size()-1, key);
}
private void MaxHeapify(int idx) {
if(idx < 0 || idx >= heap.size)
throw new IndexOutOfBoundsException();
int leftIndex = heap.getLeftIndex(idx);
int rightIndex = heap.getRightIndex(idx);
int size = heap.size();
int largest = -1;
int tmp = Integer.MIN_VALUE;
// compare with leftNode
if(leftIndex < size && heap.get(leftIndex) > heap.get(idx))
largest = leftIndex;
else
largest = idx;
// compare with rightNode
if(rightIndex < size && heap.get(rightIndex) > heap.get(largest))
largest = rightIndex;
// swap if parentNode is bigger than child.
if(largest != idx){
swap(idx,largest);
// recursive call
MaxHeapify(largest);
}
}
private void swap(int from, int to) {
int tmp;
tmp = heap.get(from);
heap.set(from,heap.get(to));
heap.set(to,tmp);
}
public String toString(){
return Arrays.toString(heap.array);
}
public class Heap {
int[] array = {};
int size;
public Heap(int[] src){
array = src;
size = array.length;
}
public Heap(){
array = new int[10];
size = array.length;
}
public int getLeftIndex(int idx){
return 2*idx+1;
}
public int getRightIndex(int idx){
return 2*idx+2;
}
public int getParentIndex(int idx){return idx/2;}
// heap's size
public int size(){
return size;
}
// array's size
public int length(){
return array.length;
}
public void incrementSize(){ size++; }
public void decrementSize(){
size--;
}
public int get(int idx) {
return array[idx];
}
// if heap's size is bigger than array's length, grow array's size;
private void checkCapacity() {
int oldCapacity = length();
if(size >= oldCapacity){
int newCapacity = oldCapacity + 10;
array = Arrays.copyOf(array, newCapacity);
}
}
public int[] getHeap(){
return array;
}
public boolean isValid(int idx){
return size-1 >= idx ? true : false;
}
public void set(int idx, int value) {
if(isValid(idx)){
array[idx] = value;
return;
}
throw new IndexOutOfBoundsException();
}
}
}