一.解释:
二叉堆是一种完全二叉树,即整棵二叉树中除了最底层的叶子节点之外,其余节点是填满的,而最底层的叶子节点由左到右也是填满的不能存在空隙。
堆主要包括两类:大顶堆和小顶堆。大顶堆指每个节点的键值(key)都大于或等于其叶子节点的键值,而小顶堆指每个节点键值都小于等于其节点的键值。STL中堆主要使用vector、实现的。大顶堆的最大值在根节点,故其总是位于底层的vector、的起头处;小顶堆的最小值在根节点,故其总是位于vector/array的起头处。
二.用法:
1.头文件
#include <algorithm>
2.操作
make_heap(_First, _Last)//默认建大根堆,其中_First, _Last为指针
make_heap(_First,_Last,greater<int>())//建小根堆
make_heap(_First,_Last,less<int>())//建大根堆
push_heap (_First, _Last)//要现在vector中添加数据,其实相当于重新排序成大根堆
push_heap (_First, _Last,greater<int >())//注意比较函数一定要与make_heap建堆时一致
push_heap (_First, _Last,less<int >())//在大根堆中加入元素
pop_heap(_First, _Last)//弹出堆顶元素,实际是放到容器的最后,配合vector.pop_back()使用
pop_heap(_First, _Last,greater<int >())//同样要注意大小堆的问题
pop_heap(_First, _Last,greater<int >())
sort_heap(_First, _Last,greater<int >()) //堆排序,小根堆只能降序
sort_heap(_First, _Last,less<int >())//大根堆只能升序
三.例子:
# include <iostream>
# include <functional>
# include <vector>
# include <algorithm>
using namespace std;
void printVec(vector<int> nums)
{
for (int i = 0; i < nums.size(); ++i)
cout << nums[i] << " ";
cout << endl;
}
int main(void)
{
int nums_temp[] = {8, 3, 4, 8, 9, 2, 3, 4, 10};
vector<int> nums(nums_temp, nums_temp + 9);
cout << "make_heap之前: ";
printVec(nums);
cout << "(默认(less))make_heap: ";
make_heap(nums.begin(), nums.end());
printVec(nums);
cout << "(less)make_heap: ";
make_heap(nums.begin(), nums.end(), less<int> ());
printVec(nums);
cout << "(greater)make_heap: ";
make_heap(nums.begin(), nums.end(), greater<int> ());
printVec(nums);
cout << "此时,nums为小顶堆 greater" << endl;
cout << "push_back(3)" << endl;
nums.push_back(3);
cout << "默认(less)push_heap 此时push_heap失败: ";
push_heap(nums.begin(), nums.end());
printVec(nums);
cout << "push_heap为greater 和make_heap一致,此时push_heap成功: ";
push_heap(nums.begin(), nums.end(), greater<int>());
printVec(nums);
cout << "(greater,不然会失败)pop_heap: ";
pop_heap(nums.begin(), nums.end(),greater<int>());
printVec(nums);
cout << "pop_back(): ";
nums.pop_back();
printVec(nums);
cout << "小根堆sort_heap(): ";
sort_heap(nums.begin(), nums.end(),greater<int>());
printVec(nums);
cout << "(less)make_heap: ";
make_heap(nums.begin(), nums.end(), less<int> ());
printVec(nums);
cout << "大根堆sort_heap(): ";
sort_heap(nums.begin(), nums.end(),less<int>());
printVec(nums);
}