堆是和队列差不多的一种数据结构,但它有优先级,我们今天来用静态二叉树表示(通过下标控制):



#include<iostream>

#include<vector>

using namespace std;

template<class T>

struct Less {

       booloperator()(const T& L, const T& R)//仿函数

       {

              returnL > R?true : false;

       }

};

template <class T>

struct Great {

       booloperator()(const T& L, const T& R)

       {

              returnL < R?true : false;

       }

};

template<class T,class Compare>

class heap {

public:

       heap(T*a,size_t n)

       {

              v.reserve(n);//开辟空间

              for(size_t i = 0; i < n; i++)

              {

                     v.push_back(a[i]);

              }

              for(int i = (n - 2) / 2; i >=0; i--)//不能使用size_t类型,它是无符号整形,减到0之后又会从最大的开始减,用int可以跳出循环

              {

                     size_tnum = v.size();

                     adjustdown(i,num);

              }

       }

       voidadjustdown(int i,int n)

       {

              CompareC;

              intparent = i;

              intchild = i * 2 + 1;

              while(child < n)

              {

                     if(child<(n-1)&&C(v[child],v[child + 1]))

                     {

                            child++;

                     }

                     elseif(C(v[parent],v[child]))

                     {

                            swap(v[parent],v[child]);

                            parent= child;

                            child= parent * 2 - 1;//继续往下比较

                     }

                     else

                     {

                            break;

                     }

              }

       }

       voidadjustup(int i)

       {

              intchild = i;

              intparent = (i - 1) / 2;

              Compareco;

              while(parent >= 0)

              {

                     if(co(v[parent],v[child]))

                     {

                            swap(v[parent],v[child]);

                            child= parent;

                            parent= (child - 1) / 2;

                     }

                     else

                     {

                            break;

                     }

              }

       }

       voidpop()//删除

       {

              size_tn = v.size() - 1;

              swap(v[0],v[n]);

              v.pop_back();

              adjustdown(0,n-1);

       }

       voidpush(const T& x)//插入

       {

              v.push_back(x);//插入到最后一个位置

              size_tn = v.size() - 1;

              adjustup(n);//向上调整

       }

       boolempty()

       {

              returnv.empty();

       }

private:

       vector<int>v;

};

int main()

{

       inta[] = { 10,13,15,17,19,20,11,14,18,16 };

       heap<int,Great<int>> hh(a, sizeof(a) / sizeof(a[0]));//大堆

       //heap<int,Less<int>> hh(a, sizeof(a) / sizeof(a[0]));//小堆

       hh.push(25);

       hh.pop();

       return0;

}

 

 

大堆(父节点都比子节点大):


小堆(父节点都比子节点小):


全部评论

相关推荐

UtopianYou...:这个简历排版真的不太行哦,去找免费的或者花点小钱,把排版弄整齐一点吧,看着舒服。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4356次浏览 77人参与
# AI面会问哪些问题? #
28127次浏览 565人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15335次浏览 223人参与
# 你的实习产出是真实的还是包装的? #
20302次浏览 343人参与
# 找AI工作可以去哪些公司? #
9269次浏览 246人参与
# 春招至今,你的战绩如何? #
65914次浏览 584人参与
# 厦门银行科技岗值不值得投 #
8072次浏览 188人参与
# 从事AI岗需要掌握哪些技术栈? #
9098次浏览 319人参与
# 中国电信笔试 #
32033次浏览 293人参与
# 你做过最难的笔试是哪家公司 #
34008次浏览 244人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340927次浏览 2175人参与
# 哪些公司真双非友好? #
69672次浏览 289人参与
# 阿里笔试 #
178839次浏览 1317人参与
# 机械人避雷的岗位/公司 #
62708次浏览 393人参与
# 小马智行求职进展汇总 #
25139次浏览 80人参与
# 第一份工作一定要去大厂吗 #
14817次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22158次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26269次浏览 310人参与
# 应届生第一份工资要多少合适 #
20692次浏览 86人参与
# 沪漂/北漂你觉得哪个更苦? #
9990次浏览 194人参与
# 聊聊你的职场新体验 #
336545次浏览 1895人参与
# HR最不可信的一句话是__ #
6325次浏览 114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务