1+ #include " heap.h"
2+ void Heap::siftdown (int pos, compare comp)
3+ {
4+ while (!isLeaf (pos))
5+ {
6+ int temp, temppos;
7+ if (rightchild (pos) < heapsize && !comp (_vec[leftchild (pos)] , _vec[rightchild (pos)]))
8+ {
9+ temppos = rightchild (pos);
10+ temp = _vec[temppos];
11+ }
12+ else
13+ {
14+ temppos = leftchild (pos);
15+ temp = _vec[temppos];
16+ }
17+ if (!comp (_vec[pos] , temp))
18+ {
19+ swap (_vec[pos], _vec[temppos]);
20+ pos = temppos;
21+ }
22+ else return ;
23+ }
24+ }
25+
26+ void Heap::insert (int value)
27+ {
28+ int curr = heapsize++;
29+ _vec.push_back (value);
30+ while (curr != 0 )
31+ {
32+ if (_vec[curr] < _vec[parent (curr)])
33+ {
34+ swap (_vec[curr], _vec[parent (curr)]);
35+ curr = parent (curr);
36+ }
37+ else break ;
38+ }
39+ }
40+
41+ int Heap::remove (int pos)
42+ {
43+ if (pos == heapsize - 1 )
44+ {
45+ _vec.pop_back ();
46+ heapsize--;
47+ }
48+ else
49+ {
50+ swap (_vec[pos], _vec[--heapsize]);
51+ _vec.pop_back ();
52+ while (pos != 0 && _vec[pos] < _vec[parent (pos)])
53+ {
54+ swap (_vec[pos], _vec[parent (pos)]);
55+ pos = parent (pos);
56+ }
57+ if (heapsize != 0 ) siftdown (pos, comp);
58+ }
59+ return _vec[heapsize];
60+ }
61+
62+ int Heap::removeroot ()
63+ {
64+ if (heapsize == 0 ) return -1 ;
65+ int res = _vec[0 ];
66+ swap (_vec[0 ], _vec[--heapsize]);
67+ _vec.pop_back ();
68+ if (heapsize != 0 ) siftdown (0 , comp);
69+ return res;
70+ }
71+
72+
73+ // int main(int argc, char const *argv[])
74+ // {
75+ // //test
76+ // Heap MinHeapByList{1, 2, 4, 3, 4, 6, 8, 1, 6, 4, 2};
77+ // Heap MaxHeapByList({1, 2, 4, 3, 4, 6, 8, 1, 6, 4, 2}, greater<int>());
78+ // vector<int> vec{3, 3, 6, 6, 7, 3, 5, 7, 1, 6};
79+ // Heap MinHeapByvector(vec);
80+ // Heap MaxHeapByvector(vec, greater<int>());
81+ // MinHeapByList.printHeap();
82+ // MaxHeapByList.printHeap();
83+ // MinHeapByvector.printHeap();
84+ // MaxHeapByvector.printHeap();
85+ // cout << MinHeapByvector.remove(1) << MaxHeapByvector.remove(1) << MinHeapByList.remove(1) << MaxHeapByList.remove(1);
86+ // return 0;
87+ // }
0 commit comments