Advertisement
UriSteiff

MaxHeap

May 31st, 2021
792
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.66 KB | None | 0 0
  1. package homework;
  2.  
  3. import java.util.Arrays;
  4.  
  5. public class MaxHeap {
  6.     private int size; // # of nodes
  7.     private int capacity; // array capacity
  8.     private int[] array; // array of nodes
  9.    
  10.     // constructor for empty heap
  11.     public MaxHeap(int capacity) {
  12.         this.capacity = capacity;
  13.         this.size = 0;
  14.         this.array = new int[capacity];
  15.  
  16.     }
  17.    
  18.     // constructor for array->heap
  19.     public MaxHeap(int[] array) {
  20.         this.capacity = array.length;
  21.         this.size = array.length;
  22.         this.array = array;
  23.         buildHeap();
  24.     }
  25.    
  26.     private int left(int i) {
  27.         return 2*i + 1;
  28.     }
  29.    
  30.     private int right(int i) {
  31.         return 2*i + 2;
  32.    
  33.     }
  34.    
  35.     private boolean hasLeft(int i) {
  36.         return left(i) < size;
  37.     }
  38.    
  39.     private boolean hasRight(int i) {
  40.         return right(i) < size;
  41.     }
  42.    
  43.     private int parent(int i) {
  44.         return (i - 1) / 2;
  45.     }
  46.    
  47.     private boolean isLeaf(int i) {
  48.         return !hasLeft(i) && !hasLeft(i);
  49.     }
  50.    
  51.     private void swap(int i, int j) {
  52.         // swap 2 places (nodes) in array (heap)
  53.         int tmp = this.array[i];
  54.         this.array[i] = this.array[j];
  55.         this.array[j] = tmp;   
  56.     }
  57.    
  58.     private void heapifyDown(int i) {
  59.         if (i < this.size && !isLeaf(i)) {
  60.             int index = i;
  61.             if (hasLeft(i) && this.array[left(i)] > this.array[i]) { // left child is larger
  62.                 index = left(i);
  63.             }
  64.             if (hasRight(i) && this.array[right(i)] > this.array[index]) { // right child is maximal
  65.                 index = right(i);
  66.             }
  67.             if (index != i) {
  68.             swap(i, index); // swap places between i and largest child if exists
  69.             heapifyDown(index);
  70.             }
  71.             else {
  72.                 return ;
  73.             }
  74.         }
  75.         else {
  76.             return;
  77.         }
  78.        
  79.     }
  80.    
  81.     private void heapifyUp(int i) {
  82.         if (i >= 1 && this.array[i] > this.array[parent(i)]) {
  83.             swap(i, parent(i));
  84.             heapifyUp(parent(i));
  85.         }
  86.         else {
  87.             return;
  88.         }
  89.     }
  90.    
  91.     // build heap from array
  92.     private void buildHeap() {
  93.         int n = this.size;
  94.         for (int i = n - 1; i >= 0; i--) {
  95.             heapifyDown(i);
  96.         }
  97.     }
  98.    
  99.     public void insert(int key) {
  100.         if (this.size < this.capacity) {
  101.             this.array[this.size++] = key;
  102.             heapifyUp(this.size - 1);
  103.         }
  104.         else { // array is full
  105.             return;
  106.         }
  107.     }
  108.    
  109.     public void increaseKey(int i, int inc) {
  110.         if (i > this.size) { // not in heap
  111.             return;
  112.         }
  113.         else {
  114.             this.array[i] += inc;
  115.             heapifyUp(i);
  116.         }
  117.     }
  118.    
  119.     public void delete (int i) {
  120.         if (i < this.size) {
  121.             this.array[i] = this.array[this.size-1];
  122.             this.size -= 1;
  123.             heapifyDown(i);
  124.             heapifyUp(i);
  125.         }
  126.        
  127.     }
  128.    
  129.     public int max() {
  130.         return this.array[0];
  131.     }
  132.    
  133.     @Override
  134.     public String toString() {
  135.         int[] arr = new int[this.size];
  136.         for (int i = 0; i < this.size; i++) {
  137.             arr[i] = this.array[i];
  138.         }
  139.         return Arrays.toString(arr);
  140.     }
  141.        
  142.    
  143. }
  144.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement