#include <vector>
#include <iostream>
#include <algorithm> // heap algorithms
using namespace std;
// heap的所有元素都必须遵循特别的完全二叉树排列规则,所有heap不提供遍历功能,也不提供迭代器
int main()
{
// 底层以vector完成
int ia[9] = {0, 1, 2, 3, 4, 8, 9, 3, 5};
vector<int> ivec(ia, ia + 9);
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << ' ';
cout << endl;
make_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << ' ';
cout << endl;
ivec.push_back(7);
push_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << ' ';
cout << endl;
pop_heap(ivec.begin(), ivec.end());
cout << ivec.back() << endl; // 9 返回但是不移除
ivec.pop_back(); // 移除最后一个元素,不返回
for (int i = 0; i < ivec.size(); i++)
cout << ivec[i] << ' ';
cout << endl;
sort_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << ' ';
cout << endl;
make_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << ' ';
cout << endl;
}
输出:
// test heap (底层以array完成)
int ia[9] = {0, 1, 2, 3, 4, 8, 9, 3, 5};
make_heap(ia, ia + 9);
for (int i = 0; i < 9; ++i)
cout << ia[i] << ' ';
cout << endl;
// 经排序之后的heap,不再是一个合法的heap
// array无法动态改变大小,因此不可以对满载的array进行push_heap()操作
// 因为那得先在array尾端增加一个元素。如果对一个满载的array执行
// push_heap(), 该函数会将最后一个元素视为新增元素,并将其余元素视为一个
// 完整的heap结构(实际上它们的确实), 因此执行后的结构等于原先的heap
sort_heap(ia, ia + 9);
for (int i = 0; i < 9; ++i)
cout << ia[i] << ' ';
cout << endl; // 经排序之后的heap,不再是一个合法的heap
// 重新再做一个heap
make_heap(ia, ia + 9);
pop_heap(ia, ia + 9);
cout << ia[8] << endl;