aboutsummaryrefslogtreecommitdiffstats
path: root/Heap.java
diff options
context:
space:
mode:
authorjwansek <eddie.atten.ea29@gmail.com>2021-05-17 23:23:14 +0100
committerjwansek <eddie.atten.ea29@gmail.com>2021-05-17 23:23:14 +0100
commitc37e08f643475a1a3fb3e2e3f5d4cf81297970d7 (patch)
tree65b51aa28ee5c9eee73446b1326a852cb80762fa /Heap.java
parente3e864c484f871ee6b306c2899a8919f17f8ccc4 (diff)
downloadJavaDataStructures-Algorithms-c37e08f643475a1a3fb3e2e3f5d4cf81297970d7.tar.gz
JavaDataStructures-Algorithms-c37e08f643475a1a3fb3e2e3f5d4cf81297970d7.zip
added heap data structureHEADmaster
Diffstat (limited to 'Heap.java')
-rw-r--r--Heap.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/Heap.java b/Heap.java
new file mode 100644
index 0000000..4f9b37f
--- /dev/null
+++ b/Heap.java
@@ -0,0 +1,102 @@
+import java.util.ArrayList;
+import java.lang.Math;
+
+public class Heap<T extends Comparable<T>> {
+
+ private ArrayList<T> array = new ArrayList<>();
+
+ public Heap(){}
+
+ public Heap(ArrayList<T> sourceArr) {
+ array = sourceArr;
+ int pos = (int)Math.floor(array.size());
+ while (pos >= 0) {
+ siftDown(pos);
+ pos--;
+ }
+ // using a siftDown() algo for creating a new heap is worst case O(n)
+ // using a siftUp() algo would be worst case O(nlogn)
+ }
+
+ public T getMax() {
+ return array.get(0);
+ }
+
+ public T deleteMax() {
+ T toReturn = array.get(0);
+ array.set(0, array.get(array.size() - 1));
+ array.set(array.size() - 1, null);
+ siftDown(0);
+ return toReturn;
+ }
+
+ public void add(T value) {
+ array.add(value);
+ siftUp(array.size() - 1);
+ }
+
+ private void siftUp(int index) {
+ while (index > 0) {
+ int parentIndex = getParentIndex(index);
+ if (array.get(index).compareTo(array.get(parentIndex)) > 0) {
+ swap(index, parentIndex);
+ index = parentIndex;
+ } else {
+ return;
+ }
+ }
+ }
+
+ private void siftDown(int index) {
+ while (index * 2 <= array.size() - 1) {
+ int childIndex = index * 2;
+ if (childIndex + 1 <= array.size() - 1 && array.get(childIndex).compareTo(array.get(childIndex + 1)) < 0) {
+ childIndex++;
+ }
+ if (array.get(index).compareTo(array.get(childIndex)) < 0) {
+ swap(index, childIndex);
+ index = childIndex;
+ } else {
+ return;
+ }
+ }
+ }
+
+ private void swap(int index1, int index2) {
+ T temp = array.get(index1);
+ array.set(index1, array.get(index2));
+ array.set(index2, temp);
+ }
+
+ public static int getLeftChildIndex(int index) {
+ return 2 * index;
+ }
+
+ public static int getRightChildIndex(int index) {
+ return (2 * index) + 1;
+ }
+
+ public static int getParentIndex(int index) {
+ return (int)Math.floor(index / 2);
+ }
+
+ public String toString() {
+ String out = "[";
+ for (T elem : array) {
+ out += elem.toString() + ", ";
+ }
+ out += "]\n";
+ return out;
+ }
+
+ public static void main(String[] args) {
+ ArrayList<Integer> startArr = new ArrayList<>();
+ for (Integer i : new Integer[] {44, 59, 63, 10, 85, 72, 67, 12}) {
+ startArr.add(i);
+ }
+ Heap<Integer> heap = new Heap<>(startArr);
+ System.out.println(heap);
+ heap.add(73);
+ System.out.println(heap);
+ }
+}