11template <
typename KeyType,
typename ValueType>
17template <
typename KeyType,
typename ValueType>
23template <
typename KeyType,
typename ValueType>
26 mNumElements = minHeap.mNumElements;
27 mRecords = minHeap.mRecords;
28 mPointers.resize(minHeap.mPointers.size());
29 for (
auto& record : mRecords)
31 mPointers[record.index] = &record;
36template <
typename KeyType,
typename ValueType>
42 mRecords.resize(maxElements);
43 mPointers.resize(maxElements);
44 for (
int i = 0; i < maxElements; ++i)
46 mPointers[i] = &mRecords[i];
47 mPointers[i]->index = i;
57template <
typename KeyType,
typename ValueType>
63template <
typename KeyType,
typename ValueType>
68 key = mPointers[0]->key;
69 value = mPointers[0]->value;
78template <
typename KeyType,
typename ValueType>
83 if (mNumElements ==
static_cast<int>(mRecords.size()))
90 int child = mNumElements++;
91 Record * record = mPointers[child];
93 record->value = value;
99 int parent = (child - 1) / 2;
100 if (mPointers[parent]->value <= value)
111 mPointers[child] = mPointers[parent];
112 mPointers[child]->index = child;
115 mPointers[parent] = record;
116 mPointers[parent]->index = parent;
121 return mPointers[child];
124template <
typename KeyType,
typename ValueType>
128 if (mNumElements == 0)
134 Record* root = mPointers[0];
141 int last = --mNumElements;
142 Record* record = mPointers[last];
143 int parent = 0, child = 1;
144 while (child <= last)
150 int childP1 = child + 1;
151 if (mPointers[childP1]->value < mPointers[child]->value)
157 if (record->value <= mPointers[child]->value)
164 mPointers[parent] = mPointers[child];
165 mPointers[parent]->index = parent;
168 child = 2 * child + 1;
174 mPointers[parent] = record;
175 mPointers[parent]->index = parent;
179 mPointers[last] = root;
180 mPointers[last]->index = last;
184template <
typename KeyType,
typename ValueType>
193 int parent, child, childP1, maxChild;
195 if (record->value < value)
197 record->value = value;
201 parent = record->index;
202 child = 2 * parent + 1;
203 while (child < mNumElements)
207 if (childP1 < mNumElements)
210 if (mPointers[child]->value <= mPointers[childP1]->value)
225 if (value <= mPointers[maxChild]->value)
236 mPointers[parent] = mPointers[maxChild];
237 mPointers[parent]->index = parent;
240 mPointers[maxChild] = record;
241 mPointers[maxChild]->index = maxChild;
244 child = 2 * parent + 1;
247 else if (value < record->value)
249 record->value = value;
253 child = record->index;
257 parent = (child - 1) / 2;
259 if (mPointers[parent]->value <= value)
270 mPointers[child] = mPointers[parent];
271 mPointers[child]->index = child;
274 mPointers[parent] = record;
275 mPointers[parent]->index = parent;
282template <
typename KeyType,
typename ValueType>
285 for (
int child = 0; child < mNumElements; ++child)
287 int parent = (child - 1) / 2;
290 if (mPointers[child]->value < mPointers[parent]->value)
295 if (mPointers[parent]->index != parent)
Minimum heap binary tree.