stl 堆算法

学习前提:数据结构与算法中的堆

对make_heap(), pop_heap(), push_heap()的用法做个总结:
make_heap()生成堆,他有两个参数,也可以有三个参数,前两个参数是指向开始元素的迭代器和指向结束元素的下一个元素的迭代器。第三个参数是可选的,可以用伪函数less()和greater()来生成大顶堆和小顶堆,其中type为元素类型。如果只传入前两个参数,默认是生成大顶堆。
push_heap()是在堆的基础上进行数据的插入操作,参数与make_heap()相同,需要注意的是,只有make_heap()和push_heap()同为大顶堆或小顶堆,才能插入。
pop_heap()是在堆的基础上,弹出堆顶元素。这里需要注意的是,pop_heap()并没有删除元素,而是将堆顶元素和数组最后一个元素进行了替换,如果要删除这个元素,还需要对数组进行pop_back()操作。
若用make_heap(), pop_heap(), push_heap(),需要添加头文件 # include<algorithm> 。
用less ()和greater () 需要添加头文件 # include<functional>。
实例代码

#include<iostream>
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
void printarray(int a[],int len)
{
      for (int i=0;i<len;i++)
      {
           cout<<a[i]<<" ";
      }
      cout<<endl;
}
void printvector(vector<int> num)
{
      for (int i=0;i<num.size();i++)
      {
            cout<<num[i]<<" ";
      }
      cout<<endl;
}
int a[100];
vector <int> v;
int main()
{
      int n;
      cin>>n;
      for (int i=0;i<n;i++)
      {
           cin>>a[i];
           v.push_back(a[i]);
     }
     make_heap(a,a+n);
     printarray(a,n);
     make_heap(v.begin(),v.end());
     printvector(v);
     int x;
     cin>>x;
     a[n]=x;
     push_heap(a,a+n+1);
     printarray(a,n+1);
     v.push_back(x);
     push_heap(v.begin(),v.end());
     printvector(v);
}
/*
in
7
4 3 7 8 5 3 4
6
out
8 5 7 3 4 3 4
8 5 7 3 4 3 4
8 6 7 5 4 3 4 3
8 6 7 5 4 3 4 3
*/
实例二

#include<iostream>
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
void printarray(int a[],int len)
{
for (int i=0;i<len;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void printvector(vector<int> num)
{
for (int i=0;i<num.size();i++)
{
cout<<num[i]<<" ";
}
cout<<endl;
}
int a[100];
vector <int> v;
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>a[i];
v.push_back(a[i]);
}
make_heap(a,a+n,greater<int>());
printarray(a,n);
make_heap(v.begin(),v.end(),less<int>());
printvector(v);
int x;
cin>>x;
a[n]=x;
push_heap(a,a+n+1);
printarray(a,n+1);
v.push_back(x);
push_heap(v.begin(),v.end());
printvector(v);
push_heap(a,a+n+1,greater<int>());
printarray(a,n+1);
push_heap(v.begin(),v.end(),greater<int>());
printvector(v);

}
/*
in
7
4 3 7 8 5 3 4
6
out
7
3 3 4 8 5 7 4
8 5 7 3 4 3 4
3 3 4 8 5 7 4 6
8 6 7 5 4 3 4 3
3 3 4 6 5 7 4 8
3 8 7 6 4 3 4 5
*/

posted @   心悟&&星际  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示