-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathheap.h
142 lines (122 loc) · 3.01 KB
/
heap.h
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
#ifndef LAB3_SRC_HEAP_H_
#define LAB3_SRC_HEAP_H_
#include <cstddef>
#include <string>
#include <stdlib.h>
using namespace std;
// generic heap that stores pairs (Key, Object)
template <typename Key, typename Object>
class Heap {
// each heap entry stores a key, object pair
struct HeapEntry {
Key _key;
Object _object;
};
// array wilth all the heap entries
HeapEntry * _heap;
// number of elements in heap
int _last;
// maximum space in heap before extending
int _max;
public:
Heap();
void addElement(Key key, Object object);
Object removeMin();
int size() { return _last; }
Key keyAt(int i);
Object objectAt(int i);
Key minKey();
Object minElement();
};
#define iparent(ch)(((ch)-1)/2)
#define ileft(p) (2*(p)+1)
#define iright(p) (2*(p)+2)
// Heap constructor
template <typename Key, typename Object>
Heap<Key, Object>::Heap() {
_last = 0;
_max = 100;
_heap = new HeapEntry[100];
}
// add a key,object pair to the heap
template <typename Key, typename Object>
void Heap<Key, Object>::addElement(Key key, Object object) {
HeapEntry entry;
entry._key = key;
entry._object = object;
_heap[_last] = entry;
_last++;
int child = _last - 1;
int parent = iparent(child);
//int iterator = _last;
while(child > 0){
if(_heap[child]._key > _heap[parent]._key){
break;
}
HeapEntry temp = _heap[child];
_heap[child] = _heap[parent];
_heap[parent] = temp;
child = parent;
parent = iparent(child);
//iterator--;
}
}
// remove the minimum element from the heap. Return corresponding object.
template <typename Key, typename Object>
Object Heap<Key, Object>::removeMin() {
Object min = _heap[0]._object;
_last--;
if(_last == 0){
return _heap[0]._object;
}
_heap[0] = _heap[_last];
int parent = 0;
int left = ileft(parent);
int right = iright(parent);
while(left < _last){
int minChild = left;
if(right < _last && (_heap[right]._key < _heap[left]._key)){
minChild = right;
}
if(_heap[parent]._key < _heap[minChild]._key){
break;
}
HeapEntry temp = _heap[minChild];
_heap[minChild] = _heap[parent];
_heap[parent] = temp;
parent = minChild;
left = ileft(parent);
right = iright(parent);
}
return min;
}
// return object at location
template <typename Key, typename Object>
Key Heap<Key, Object>::keyAt(int i) {
return _heap[i]._key;
}
template <typename Key, typename Object>
Object Heap<Key, Object>::objectAt(int i) {
return _heap[i]._object;
}
template <typename Key, typename Object>
Key Heap<Key, Object>::minKey() {
Key min = _heap[0]._key;
for(int j = 0; j<_last; j++){
if(_heap[j]._key < min){
min = _heap[j]._key;
}
}
return min;
}
template <typename Key, typename Object>
Object Heap<Key, Object>::minElement() {
Object obj = _heap[0]._object;
for(int j = 0; j<_last; j++){
if(_heap[j]._object < obj){
obj = _heap[j]._object;
}
}
return obj;
}
#endif // LAB3_SRC_HEAP_H_