sort_heap:
既然每次pop_heap可获得heap中键值最大元素,如果持续对整个heap做pop_heap操作,每次将操作范围从后向前减一个元素(因为pop_heap会把键值最大的元素放在底部容器的最尾端),当整个程序执行完毕时,我们便有了一个递增序列。
下面是sort_heap算法的实现细节。该函数接受两个迭代器,用来表现一个heap底部容器的头尾。如果不符合这个条件,sort_heap的执行结果未可预期。注意排序后,原来的heap就不再是一个合法的heap了。
template <class RandomAccessIterator>
void sort_heap(RandomAccessIterator first, RandomAccessIterator last)
{
//以下,每执行一次pop_heap(),极值即被放在尾端。扣除尾端再执行一次pop_heap,次极值又被放在新尾端。
//一直下去,最后即得排序结果
while(last-first>1)
{
pop_heap(first, last--);
}
}
make_heap:
该算法用来将一段现有的数据转化为一个heap。
//将[first, last)排序成一个heap
template <class RandomAccessIterator>
inline void make_heap(RandomAccessIterator first, RandomAccessIterator last)
{
__make_heap(first, last, value_type(first), distance_type(first));
}
template <class RandomAccessIterator, class T, class Distance>
void __make_heap(RandomAccessIterator first, RandomAccessIterator last, T*, Distance *)
{
if(last-first<2) return;
Distance len = last-first;
Distance parent = (len-2)/2;
while(true)
{
__adjust_heap(first, parent, len, T(*(first+parent)));
if(parent==0) return;
parent--;
}
}