-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpriorityQueue.cpp
155 lines (138 loc) · 3.08 KB
/
priorityQueue.cpp
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
#include <iostream>
#include <functional>
#include <stdlib.h>
#include <time.h>
using namespace std;
class PriorityQueue
{
public:
using Comp = function<bool(int, int)>;
PriorityQueue(int cap = 20, Comp comp = greater<int>())
: size_(0), cap_(cap), comp_(comp)
{
que_ = new int[cap_];
}
PriorityQueue(Comp comp) : size_(0), cap_(20), comp_(comp)
{
que_ = new int[cap_];
}
~PriorityQueue()
{
delete []que_;
que_ = nullptr;
}
void push(int val)
{
if(size_ == cap_)
{
int* p = new int[2 * cap_];
memcpy(p, que_, cap_ * sizeof(int));
delete[] que_;
que_ = p;
cap_ *= 2;
}
if(size_ == 0) //插入第一个元素,不需要为了排序,进行元素调整
{
que_[size_] = val;
}
else
{
siftUp(size_, val);
}
++size_;
}
void pop()
{
if(size_ == 0)
{
throw "container is empty!";
}
--size_;
if(size_ > 0)
{
siftDown(0, que_[size_]);
}
}
bool empty() const
{
return size_ == 0;
}
int top() const
{
if(size_ == 0)
{
throw "container is empty!";
}
return que_[0];
}
int size() const
{
return size_;
}
private:
//入堆元素向上调整 O(logn),val要和之前的i个元素进行比较
void siftUp(int i, int val)
{
while(i > 0)
{
int father = (i - 1) / 2; //计算到根节点
if(comp_(val, que_[father]))
{
que_[i] = que_[father];
i = father;
}
else
{
break;
}
}
que_[i] = val;
}
void siftDown(int i, int val)
{
while(i < size_ / 2)
{
int child = 2 * i + 1; //第i个节点的左孩子
if(child + 1 < size_ && comp_(que_[child + 1], que_[child]))
{
//如果第i个节点的右孩子的值大于左孩子的值,child记录右孩子的下标
child = child + 1;
}
if(comp_(que_[child], val))
{
que_[i] = que_[child];
i = child;
}
else
{
break;
}
}
que_[i] = val;
}
int* que_;
int size_;
int cap_;
Comp comp_;
};
int main()
{
//PriorityQueue maxQue;
PriorityQueue minQue([](int a, int b){return a < b;});
cout << boolalpha << minQue.empty() << endl;
cout << minQue.size() << endl;
srand(time(0));
for(int i = 0; i < 10; ++i)
{
minQue.push(rand() % 100);
}
cout << boolalpha << minQue.empty() << endl;
cout << minQue.size() << endl;
while(!minQue.empty())
{
cout << minQue.top() << " ";
minQue.pop();
}
cout << endl;
return 0;
}