package heap;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class MaximumHeap {
int[] heapData;
int dataSize;
int dataCapacity;
public MaximumHeap(int[] data) {
heapData = new int[data.length];
System.arraycopy(data, 0, heapData, 0, data.length);
dataSize = heapData.length;
}
public MaximumHeap(int capacity){
dataCapacity = capacity;
heapData = new int[capacity];
dataSize = 0;
}
public void setSize(int size){
dataSize = size;
}
public int getSize(){
return dataSize;
}
public int[] getHeapData(){
return heapData;
}
public int getParentIndex(int index){
return (index - 1)/2; }
public int getLeftChildIndex(int index){
return (2 * index) + 1; }
public int getRightChildIndex(int index){
return (2 * index) + 2; }
public void build(){
for(int i = dataSize/2 - 1; i >= 0; i--){
floatDownValue(i);
}
}
public void insert(int value){
if (dataSize < dataCapacity){
if (dataSize > 0){
heapData[dataSize++] = value;
floatUpValue(dataSize - 1);
}else{
heapData[dataSize++] = value;
}
}
}
public int extractMax(){
int max = heapData[0];
heapData[0] = heapData[dataSize - 1];
dataSize--;
floatDownValue(0);
return max;
}
public void modifyValue(int index, int value){
int oldValue = heapData[index];
heapData[index] = value;
if(value > oldValue){
floatUpValue(index);
}else{
floatDownValue(index);
}
}
public void floatUpValue(int index){
if(index > 0){
int parentIndex = getParentIndex(index);
int indexData = heapData[index];
if(heapData[parentIndex] < heapData[index]){
heapData[index] = heapData[parentIndex];
heapData[parentIndex] = indexData;
floatUpValue(parentIndex);
}
}
}
public void floatDownValue(int index){
if(index > (dataSize/2 -1)) return;
int leftChildIndex = getLeftChildIndex(index);
int rightChildIndex = getRightChildIndex(index);
int indexData = heapData[index];
int largeChildIndex;
if( rightChildIndex < dataSize &&
heapData[leftChildIndex] < heapData[rightChildIndex]){
largeChildIndex = rightChildIndex;
}else{
largeChildIndex = leftChildIndex;
}
if (heapData[index] < heapData[largeChildIndex]){
heapData[index] = heapData[largeChildIndex];
heapData[largeChildIndex] = indexData;
floatDownValue(largeChildIndex);
}
}
public void displayData(){
int log2 = 0;
int count = 0;
for (int i = 0; i < dataSize; i++){
System.out.print( i + "=" + heapData[i] + " ");
if (i == count){
System.out.println();
count = (i + 1) * 2;
}
}
System.out.println("\n\n");
}
}