//heap.hpp
#pragma once
#include <vector>
#include <functional>
#include <algorithm>
namespace wxn{
template <typename T, typename Compare = std::greater<T>> //默认大顶堆, 如果指定为std::less<T>为小顶堆
class w_heap{ //默认大顶堆
private:
std::vector<T> data;
public:
w_heap(const std::vector<T> data_):data(std::move(data_)){
makeHeap();
}
w_heap(const w_heap&) = delete;
w_heap& operator=(const w_heap&) = delete;
private:
void makeHeap(){
int size = data.size();
for(int index = (size >> 1) - 1; index >= 0; --index){
adjDown(index, size);
}
}
void adjDown(int index, int size){ // 父i 左子2*i + 1 右子2*i + 2
int left = 2 * index + 1, right = 2 * index + 2;
if(left >= size) return; // 左孩子下标越界,右孩子下标必越界
int mid = 0;
if(right >= size){//右孩子下标越界
mid = left;
}else{
mid = Compare()(data[left], data[right]) ? left : right;
}
if(Compare()(data[index], data[mid])) return;
std::swap(data[index], data[mid]);
adjDown(mid, size);
}
public:
std::vector<T> sort(){
int size = data.size();
for(int index = size - 1; index >= 0; --index){
std::swap(data[0], data[index]);
adjDown(0, index);
}
return data;
}
};
}
main.cpp
#include "heap.hpp"
#include <iterator>
#include <iostream>
int main(){
wxn::w_heap<int> wp({2, 1, 5, 3, 4, 9, 5, 7, 10});
std::vector<int> ans = wp.sort();
std::copy(ans.begin(), ans.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
return 0;
}