在STL中堆heap
的算法都包含在#include<algorithm>
头文件中,主要包含以下函数:
make_heap()
生成堆,默认less(生成大顶堆)
make_heap(_RAIter,_RAIter)
默认生成大顶
make_heap(_RAIter,_RAIter,_Compare)
_Compare有两种参数,一种是greater(生成小顶堆),一种是less(生成大顶堆)
堆操作:增加元素(push_heap),删除元素(pop_heap), 排序(sort_heap), 均要求区间已经是一个heap,并且是与当前操作使用相同的排序准则
push_heap()
是向堆中插入一个元素,使堆的规制依然成立
push_heap(_RAIter,_RAIter)
默认为大顶堆
push_heap(_RAIter,_RAIter,_Compare)
_Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
调用push_heap
之前必须调用make_heap
创建一个堆
首先数组push_back
插入元素,然后再调用push_heap
,它会使最后一个元素插到合适位置
注意,push_heap中的_Compare和make_heap中的_Compare参数必须是一致的,不然会插入堆失败,最后一个元素还是在最后位置,导致插入失败
pop_heap
在堆的基础上弹出堆顶元素
pop_heap(_RAIter,_RAIter)
默认为大顶堆
pop_heap(_RAIter,_RAIter,_Compare)
_Compare有两种参数,一种是greater(小顶堆),一种是less(大顶堆)
比如pop_heap(nums.begin(), nums.end(),greater<int>())
,它会将堆顶元素(即为数组第一个位置)和数组最后一个位置对调,然后你可以调用数组pop_back
,删除这个元素
注意,pop_heap
中的_Compare和make_heap中的_Compare参数必须是一致的,不然会失败
sort_heap
堆排序算法
// 1
template< class RandomIt >
void sort_heap( RandomIt first, RandomIt last );
// 2
template< class RandomIt, class Compare
void sort_heap( RandomIt first, RandomIt last, Compare comp );
注意:
- 使用
sort_heap(f, l)
处理过的区间因为已经有序,就不再是一个heap了。sort_heap(f, l)
的cmp参数必须与make_heap(f,l)的cmp参数一致,否则堆排序失败。
C++11加入两个新成员is_heap
和is_heap_until
略作了解。
- 示例代码
# include <iostream>
# 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);
sort_heap(nums.begin(),nums.end(),greater<int>());
cout<<"堆排序结果:";
printVec(nums);
}
- 运行结果
make_heap之前: 8 3 4 8 9 2 3 4 10
(默认(less))make_heap: 10 9 4 8 8 2 3 4 3
(less)make_heap: 10 9 4 8 8 2 3 4 3
(greater)make_heap: 2 3 3 4 8 4 10 9 8
此时,nums为小顶堆 greater
push_back(3)
默认(less)push_heap 此时push_heap失败: 2 3 3 4 8 4 10 9 8 3
push_heap为greater 和make_heap一致,此时push_heap成功: 2 3 3 4 3 4 10 9 8 8
(greater,不然会失败)pop_heap: 3 3 4 4 3 8 10 9 8 2
pop_back(): 3 3 4 4 3 8 10 9 8
堆排序结果:10 9 8 8 4 4 3 3 3