用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()调整。

posted @ 2011-08-03 01:27  iliveido  Views(443)  Comments(0)    收藏  举报