-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMinBinHeap.java
More file actions
160 lines (134 loc) · 2.9 KB
/
Copy pathMinBinHeap.java
File metadata and controls
160 lines (134 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package MinBinHeap_A3;
public class MinBinHeap implements Heap_Interface {
private EntryPair[] array; //load this array
private int size;
private static final int arraySize = 10000; //Everything in the array will initially
//be null. This is ok! Just build out
//from array[1]
public MinBinHeap() {
this.array = new EntryPair[arraySize];
array[0] = new EntryPair(null, -100000); //0th will be unused for simplicity
//of child/parent computations...
//the book/animation page both do this.
}
//Please do not remove or modify this method! Used to test your entire Heap.
@Override
public EntryPair[] getHeap() {
return this.array;
}
@Override
public void insert(EntryPair entry) {
int i = size + 1;
array[i] = entry;
while(hasParent(i)) {
if(array[i].priority < parentPair(i).priority) {
swap(i, parentIndex(i));
i = parentIndex(i);
}
else {
break;
}
}
size += 1;
}
@Override
public void delMin() {
if(size == 0) {
return;
}
else if(size == 1) {
array[1] = null;
size -= 1;
}
else {
swap(1, size);
array[size] = null;
size -= 1;
fixOrder(1);
}
}
@Override
public EntryPair getMin() {
// TODO Auto-generated method stub
return array[1];
}
@Override
public int size() {
// TODO Auto-generated method stub
return size;
}
@Override
public void build(EntryPair[] entries) {
size = entries.length;
for(int i = 0; i < entries.length; i++) {
array[i + 1] = entries[i];
}
for(int i = size/2; i > 0; i--) {
fixOrder(i);
}
}
private void fixOrder(int i) {
int smallest = i;
while(hasLeftChild(i) || hasRightChild(i)) {
if(hasLeftChild(i) && array[smallest].priority > leftChild(i).priority ) {
smallest = leftChildIndex(i);
}
if(hasRightChild(i) && array[smallest].priority > rightChild(i).priority) {
smallest = rightChildIndex(i);
}
if(i == smallest) {
break;
}
swap(i, smallest);
i = smallest;
}
}
private void swap(int index1, int index2) {
EntryPair temp = null;
temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
private int parentIndex(int i) {
return i/2;
}
private int leftChildIndex(int i) {
return 2*i;
}
private int rightChildIndex(int i) {
return 2*i + 1;
}
private EntryPair parentPair(int i) {
return array[parentIndex(i)];
}
private EntryPair leftChild(int i) {
return array[leftChildIndex(i)];
}
private EntryPair rightChild(int i) {
return array[rightChildIndex(i)];
}
private boolean hasParent(int i) {
if(i != 1) {
return true;
}
else {
return false;
}
}
private boolean hasLeftChild(int i) {
if(leftChildIndex(i) <= size && array[leftChildIndex(i)] != null ) {
return true;
}
else {
return false;
}
}
private boolean hasRightChild(int i) {
if(rightChildIndex(i) <= size && array[rightChildIndex(i)] != null) {
return true;
}
else {
return false;
}
}
}