1. 程式人生 > 其它 >stl 堆演算法

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
*/