| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- public class IntMinHeap {
- private int[] heap;
- private int size;
- public IntMinHeap(int initialCapacity) {
- heap = new int[initialCapacity];
- }
- public IntMinHeap() {
- this(10);
- }
- public void add(int n) {
- if (size == heap.length) expandHeap();
- heap[size] = n;
- int child = size++;
- int parent = parent(child);
- while (child > 0 && heap[parent] > heap[child]) {
- swap(heap, child, parent);
- child = parent;
- parent = parent(child);
- }
- }
- public void addCountedLoops(int n) {
- if (size == heap.length) expandHeap();
- heap[size] = n;
- int child = size++;
- int parent = parent(child);
- int i = 0;
- while (child > 0 && heap[parent] > heap[child]) {
- swap(heap, child, parent);
- child = parent;
- parent = parent(child);
- i++;
- }
- System.out.println("Loop went " + i + " times");
- }
- public int remove() {
- int top = heap[0];
- heap[0] = heap[--size];
- int parent = 0;
- int child = smallerChild(parent);
- while (child != -1 && heap[parent] > heap[child]) {
- swap(heap, parent, child);
- parent = child;
- child = smallerChild(parent);
- }
- return top;
- }
- private int smallerChild(int parent) {
- int left = leftChild(parent);
- int right = rightChild(parent);
- if (left < size && right < size) return heap[left] < heap[right]
- ? left
- : right;
- else if (left < size) return left;
- else return -1;
- }
- public int size() {
- return size;
- }
- @Override
- public String toString() {
- String s = "[";
- for (int i = 0; i < size; i++) s += heap[i] + ", ";
- return s.substring(0, s.length() - 2) + "]";
- }
- public static void swap(int[] a, int i, int j) {
- int temp = a[i];
- a[i] = a[j];
- a[j] = temp;
- }
- private void expandHeap() {
- int[] oldHeap = heap;
- heap = new int[size * 2];
- for (int i = 0; i < size; i++) heap[i] = oldHeap[i];
- }
- private int parent(int child) {
- return (child - 1) / 2;
- }
- private int leftChild(int parent) {
- return parent * 2 + 1;
- }
- private int rightChild(int parent) {
- return parent * 2 + 2;
- }
- }
|