堆的简单实现(仿函数)

  



堆结构的二叉树存储是:

堆的简单实现(仿函数)


代码实现如下:

# pragma 一次      # include  & lt; iostream>   # include  & lt; vector>   # include  & lt; assert.h>      using  namespace 性传播疾病;//仿函数   template  & lt; typename  T>   struct 更大   {   bool 操作符(),(const  T ,, l, const  T ,, r)   {   return  l 祝辞,r;   }   };      template  & lt; typename  T>   少struct    {   bool 操作符(),(const  T ,, l, const  T ,, r)   {   return  l  & lt;, r;   }   };//模板参数   template  & lt; typename  T, typename 来者=Greater,在      堆class    {   公众://无参构造函数   堆()   :_a(空)   {}//有参构造函数   堆(T  *,,, size_t 大小)   {   assert ();//先把数据保存在向量中   for  (size_t 小姐:=,0;,小姐:& lt;,大小;,我+ +)   {   _a.push_back([我]);   }//建堆   for  (int  j =, ((_a.size(),安康;2),/,2);,j 祝辞=,0;,j——)   {//向下调整算法   _AdjustDown (j);   }   }      void 推动(const  T  x)//插入元素   {   _a.push_back (x);   _AdjustUp (_a.size(),安康;1);   }      void  Pop()//删除元素   {   断言(_a.size(),祝辞,0);   交换(_a [0], _a [_a.size(),安康;1]);   _a.pop_back ();   _AdjustDown (0);   }      size_t 尺寸()   {   return  _a.size ();   }      bool 空()   {   return  _a.empty ();   }      void  print ()   {   for  (int 小姐:=,0;,小姐:& lt;, _a.size();,我+ +)   {   cout  & lt; & lt;, _a[我],& lt; & lt;,“,”;   }   cout  & lt; & lt;, endl;   }      保护://向下调整算法   void  _AdjustDown (size_t 父母)   {   size_t  child =, parent  *, 2, +, 1;   comer  com;   while  (child  & lt;, _a.size ())   {//找出左右孩子中比较大的   if  (child  +, 1, & lt;, _a.size (),,,, com (_a (child  +, - 1),,, _a(孩子)))   {   孩子+ +;   }//比较父亲和孩子的大小   if  (com  (_a(孩子),_a(父)))   {   交换(_a(孩子),_a(父));   时间=parent 儿童;   *=child  parent  2, +, 1;   }   其他的   {   打破;   }   }   }//向上调整算法   void  _AdjustUp (size_t 孩子)   {   断言(child  & lt;, _a.size ());   int  parent =, (child 安康;1),/,2;   comer  com;   while  (child 祝辞,0)   {//只需看父节点& lt;根节点   if  (com (_a(孩子),_a(父)))   {   交换(_a(孩子),_a(父));   时间=child 家长;   parent =, (child 安康;1),/,2;   }   其他的   {   打破;   }   }   }      私人:   vector  & lt; T>, _a;   };

需要学习的也就是向上以及向下调整算法。

欢迎大家提出宝贵的意见。

测试用例如下:

void 测试()   {   int [],=,{, 10, 11日,13日,12日,16日,18日,15日,17日,14日,19日,};   Heap

堆的简单实现(仿函数)

堆的简单实现(仿函数)