首先是make_heap函数,该函数讲一个容器中的数据转化成heap。其构造函数有两个,一般情况下,我们直接是直接使用的是第一个,第一个构造函数只有两个参数,即容器的起点(begin)与结束点(end)。这个构造函数构造出来的是大顶堆。当我们需要构造的堆是小顶堆时,我们就可以用到第二个构造函数了。第二个构造函数参数有三个,前两个也是容器的范围,第三个参数则是排序的准则。
push_heap函数则是基于一个已经是heap的数据来添加元素,重新形成一个heap。这个函数的构造函数与make_heap函数的构造函数是一样的。
pop_heap函数则是在一个已经是heap的数据删除掉第一个元素,记住,它总是删除第一个元素!当这个函数删除了第一个元素之后,剩下来的数据元素重新排成heap。
最后一个就是sort_heap函数了。这个函数的两个构造函数与前面的函数的构造函数一样。那么这个函数的作用就是将一个heap输出为一个已序的序列,默认情况下是升序排列。
下面给出个代码来详细看看这几个函数的具体实例:

先看看实现吧:


//堆排序算法
#include "iostream"
#include "windows.h"
#include "algorithm"
#include "vector"
#include "iterator"

using namespace std;

int main()
{
	vector<int> coll;
	copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(coll));
	//输出vector中的数据
	cout<<"原vector中的数据:"<<endl;
	copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	make_heap(coll.begin(),coll.end());//将区间内的元素转化成heap
	cout<<"输出将vector排成heap后的数据:"<<endl;
	copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	pop_heap(coll.begin(),coll.end());//去除heap中的下一个元素
	coll.pop_back();
	cout<<"输出pop的第一个元素:"<<endl;
	copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	coll.push_back(17);
	cout<<"输出添加了元素之后的heap:"<<endl;
	push_heap(coll.begin(),coll.end());
	copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	sort_heap(coll.begin(),coll.end());
	cout<<"输出sort之后的不再是heap的数据:"<<endl;
	copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
	cout<<endl;

	system("pause");
	return 0;
}