IntMinHeap.java 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. public class IntMinHeap {
  2. private int[] heap;
  3. private int size;
  4. public IntMinHeap(int initialCapacity) {
  5. heap = new int[initialCapacity];
  6. }
  7. public IntMinHeap() {
  8. this(10);
  9. }
  10. public void add(int n) {
  11. if (size == heap.length) expandHeap();
  12. heap[size] = n;
  13. int child = size++;
  14. int parent = parent(child);
  15. while (child > 0 && heap[parent] > heap[child]) {
  16. swap(heap, child, parent);
  17. child = parent;
  18. parent = parent(child);
  19. }
  20. }
  21. public void addCountedLoops(int n) {
  22. if (size == heap.length) expandHeap();
  23. heap[size] = n;
  24. int child = size++;
  25. int parent = parent(child);
  26. int i = 0;
  27. while (child > 0 && heap[parent] > heap[child]) {
  28. swap(heap, child, parent);
  29. child = parent;
  30. parent = parent(child);
  31. i++;
  32. }
  33. System.out.println("Loop went " + i + " times");
  34. }
  35. public int remove() {
  36. int top = heap[0];
  37. heap[0] = heap[--size];
  38. int parent = 0;
  39. int child = smallerChild(parent);
  40. while (child != -1 && heap[parent] > heap[child]) {
  41. swap(heap, parent, child);
  42. parent = child;
  43. child = smallerChild(parent);
  44. }
  45. return top;
  46. }
  47. private int smallerChild(int parent) {
  48. int left = leftChild(parent);
  49. int right = rightChild(parent);
  50. if (left < size && right < size) return heap[left] < heap[right]
  51. ? left
  52. : right;
  53. else if (left < size) return left;
  54. else return -1;
  55. }
  56. public int size() {
  57. return size;
  58. }
  59. @Override
  60. public String toString() {
  61. String s = "[";
  62. for (int i = 0; i < size; i++) s += heap[i] + ", ";
  63. return s.substring(0, s.length() - 2) + "]";
  64. }
  65. public static void swap(int[] a, int i, int j) {
  66. int temp = a[i];
  67. a[i] = a[j];
  68. a[j] = temp;
  69. }
  70. private void expandHeap() {
  71. int[] oldHeap = heap;
  72. heap = new int[size * 2];
  73. for (int i = 0; i < size; i++) heap[i] = oldHeap[i];
  74. }
  75. private int parent(int child) {
  76. return (child - 1) / 2;
  77. }
  78. private int leftChild(int parent) {
  79. return parent * 2 + 1;
  80. }
  81. private int rightChild(int parent) {
  82. return parent * 2 + 2;
  83. }
  84. }