用heap排序须知
STL中,堆为算法(需要#include<algorithm>),而非容器。
许是因为堆的最大作用就是排序吧!堆是完全二叉树。
堆的相关函数是:make_heap,pop_heap,push_heap(),sort_heap.
堆排序算法sort_heap的使用是有限制的:sort_heap的输入比须是一个有效的堆。所以,驾驭sort_heap前最好做如下两点:
1.调用sort_heap前,调用make_heap.
2.sort_heap的基本排序算法(即sort_heap的第三个参数)要和make_heap的第三个参数一致。
例如,有一个vector<int>v;首先调用make_heap(v.begin(),v.end(),less<int>());
若接下来使用sort_heap(v.begin(),v.end(),greater<int>());将出现运行时错误,因为基本算法不一致。
之所以如此,可由一例说明。有一个最大堆(即采用make_heap和less<int>算法初始化的堆):
4
2 3
1 0
用sort_heap和greater<int>算法的过程如下,方括号内的两个值是互换之后的值:
[0]
2 3
1 [4]
0
[1] 3
[2] 4
到上图,排序终止,sort_heap的结果将会是0,1,3,2,4。显然,这个结果不是我们想要的。因此,make_heap和sort_heap的排序算法必须一样。
sort_heap的输出不是一个堆,而是一个排好序的队列。
pop_heap的输入是一个堆,输出是除了最后一个元素之外,是一个堆。
一般地,在pop_heap之后使用v.pop_back()用于取走堆的根;在v.push_back()之后,使用push_heap()调整。

浙公网安备 33010602011771号