堆
template<typename T>
class Heap {
private:
T* arr;
int capacity;
int size;
void AdjustHeap();
public:
Heap();
~Heap();
//插入
void InsertHeap(T data);
//删除堆顶
void EraseHeap();
//堆中元素数
int SizeHeap() {
return size;
}
//堆是否为空
bool EmptyHeap() {
return (size == 0);
}
//获取堆顶元素
T TopHeap() {
return arr[0];
}
};
调整堆
template<typename T>
void Heap<T>::AdjustHeap() {
for (int i = (size - 2) / 2; i >= 0; --i) {
T top = i;
T child = i * 2 + 1;
while (child < size) {
if (child + 1 < size && arr[child] > arr[child + 1]) {
child += 1;
}
if (arr[top] > arr[child]) {
T tmp = arr[top];
arr[top] = arr[child];
arr[child] = tmp;
}
top = child;
child = child * 2 + 1;
}
}
}
template<typename T>
Heap<T>::Heap() {
capacity = 10;
arr = new T[capacity];
size = 0;
}
template<typename T>
Heap<T>::~Heap() {
delete[] arr;
}
插入
template<typename T>
void Heap<T>::InsertHeap(T data) {
if (size == capacity) {
T* tmp = new T[2 * capacity];
for (int i = 0; i < size; ++i) {
tmp[i] = arr[i];
}
delete[] arr;
arr = tmp;
}
arr[size] = data;
++size;
AdjustHeap();
}
删除
template<typename T>
void Heap<T>::EraseHeap() {
T tmp = arr[0];
arr[0] = arr[size - 1];
arr[size - 1] = tmp;
--size;
AdjustHeap();
}