#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include<vector>
template <class T>
class Heap
{
public:
Heap(T* array, size_t size)
:_size(size)
{
_array.resize(_size);
for (size_t i = 0; i < _size; i++)
_array[i] = array[i];
int root = (size - 2) >> 1;
for (; root >= 0; --root)
_AdjustDown(root);
}
void Push(T data)//插入元素,並且使其任然滿足堆的性質
{
_array.push_back(data);
_size++;
_AdjustUp(_size - 1);
}
void Pop()//刪除堆頂元素,並且使其任然滿足堆的性質
{
if (_array.empty())
return;
swap(_array[0], _array[_size - 1]);
_array.pop_back();
_size--;
if (_size>0)
_AdjustDown(0);
}
void Print()
{
for (size_t i = 0; i < _size; i++)
cout << _array[i] << " ";
cout << endl;
}
private:
void _AdjustUp(int child)
{
int parent = (child - 1) >> 1;
while (/*parent >= 0*/child>0)
{
if (_array[child] > _array[parent])
return;
if (_array[child] < _array[parent])
{
swap(_array[child], _array[parent]);
child = parent;
parent = (child - 1) >> 1;
}
/*else
return;*/
}
}
void _AdjustDown(int parent)
{
int child = parent * 2 + 1;
while (child < _size)
{
if (child + 1 < _size && _array[child] > _array[child + 1])
child += 1;
if (_array[parent] > _array[child])
{
swap(_array[parent], _array[child]);
parent = child;
child = parent * 2 + 1;
}
else
return;
}
}
private:
vector<T> _array;
size_t _size;
};
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 4, 6, 8, 0 };
Heap<int> hp(arr, sizeof(arr) / sizeof(arr[0]));
hp.Print();
hp.Push(2);
hp.Print();
hp.Pop();
hp.Print();
getchar();
return 0;
}