make_heap 函数
这个函数用来将一段现有的数据转化为一个heap
template<class RandomAccessIterator>
1: make_heap(RandomAccessIterator first, RandomAccessIterator last)
2: make_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)
将[first, last)范围进行堆排序,默认使用使用最大堆排序,其中改为最小堆时,使用greater,注意greater在#include <functional>头文件中。
sort_heap 函数
template<class RandomAccessIterator>
1: sort_heap(RandomAccessIterator first, RandomAccessIterator last)
2: sort_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)
将一个堆排序,运用这个函数时,首先必须是一个堆,如果不是一个堆的数据用这个函数,会出现错误,因此在用这个函数之前可以先做一次make_heap。
特别注意:
如果一个数据是最大堆排序的,sort_heap 也要用最大堆排序;
如果一个数据是最小堆排序的,sort_heap 也要用最小堆排序,否则会报错
即:make_heap(first, last, less<int>()) 要于 sort_heap(first, last, less<int>()) 对应
make_heap(first, last, greater<int>()) 要于 sort_heap(first, last, greater<int>()) 对应
push_heap 函数
对刚插入的(尾部)元素做堆排序。
template<class RandomAccessIterator>
1: push_heap(RandomAccessIterator first, RandomAccessIterator last)
2: push_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)
pop_heap 函数
将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。
template<class RandomAccessIterator>
1: pop_heap(RandomAccessIterator first, RandomAccessIterator last)
2: pop_heap(RandomAccessIterator first, RandomAccessIterator last, cmpObject)
示例
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
int ia[9] = { 0,1,2,3,4,8,9,3,5 };
vector<int> ivec(ia, ia + 9);
make_heap(ivec.begin(), ivec.end(), greater<int>());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << " "; //输出结果为:0 1 2 3 4 8 9 3 5
cout << endl;
make_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << " ";//输出结果为:9 5 8 3 4 0 2 3 1
cout << endl;
ivec.push_back(7);
push_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << " ";//输出结果为:9 7 8 3 5 0 2 3 1 4
cout << endl;
pop_heap(ivec.begin(), ivec.end());//只是将第一元素和最后一个元素换了一个位置,并没有删除
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << " ";//输出结果为:8 7 4 3 5 0 2 3 1 9
cout << endl;
ivec.pop_back();
sort_heap(ivec.begin(), ivec.end());
for (int i = 0; i < ivec.size(); ++i)
cout << ivec[i] << " ";//输出结果为:0 1 2 3 4 5 7 8
cout << endl;
}