#include <iostream>
#include <vector>
template<typename type, typename cmp>
class ToyHeap{
public:
ToyHeap(std::vector<type>& vec):num(vec){
init();
}
void init(){
for(int i=num.size()/2; i>=0; i--){
down(i);
}
}
void pop(){
std::swap(num[0], num[num.size()-1]);
num.pop_back();
down(0);
}
void push(type v){
num.push_back(v);
up(num.size()-1);
}
type top(){
if(!num.empty()) return num[0];
std::cout << "error for empty heap" << std::endl;
exit(-1);
}
size_t size(){
return num.size();
}
private:
void down(int idx){
int t = idx, l = 2*idx + 1, r = 2 * idx + 2;
if(l < num.size() && cmp()(num[t], num[l])) t = l;
if(r < num.size() && cmp()(num[t], num[r])) t = r;
if(t != idx){
std::swap(num[t], num[idx]);
down(t);
}
}
void up(int idx){
while(idx > 0 && cmp()(num[idx/2], num[idx])){
swap(num[idx/2], num[idx]);
idx /= 2;
}
}
private:
std::vector<type> num;
};
int main(){
std::vector<int> num = {5,5, 3, 2, 4, 1};
// ToyHeap<int, std::greater<int>> heap(num);
ToyHeap<int, std::less<int>> heap(num);
for(size_t i = 0; i<num.size(); i++){
std::cout << heap.top() << " ";
heap.pop();
}
}
c++手写堆
最新推荐文章于 2025-02-11 02:41:03 发布