STL之heap(二)

       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--;
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值