基于堆得优先队列
2015-04-30 00:05
190 查看
#include <iostream>
using namespace std;
class priority_queue///简单实现了整数的优先队列(数越小优先值越大)
{
private:
int *ary;
int len;
int MAX;
void adjust_down(int st)///向下调整堆
{
while(st<len)
{
int ans=st;
if(st*2+1<len&&ary[ans]>ary[st*2+1])
ans=st*2+1;
if(st*2+2<len&&ary[ans]>ary[st*2+2])
ans=st*2+2;
if(ans==st)
return;
else
{
swap(ary[st],ary[ans]);
st=ans;
}
}
}
void adjust_on(int st)///向上调整堆
{
while(st>0)
{
int ans=st;
if(ary[st]<ary[(st-1)/2])
ans=(st-1)/2;
if(st==ans)
return;
else
{
swap(ary[st],ary[ans]);
st=ans;
}
}
}
public:
priority_queue()
{
MAX=100;
ary = new int[MAX];
len=0;
}
bool pop()///删除元素
{
if(empty())
return false;
swap(ary[0],ary[len-1]);
--len;
adjust_down(0);
return true;
}
int top()///得到队头元素
{
return ary[0];
}
void push(int x)///插入数据
{
if(len==MAX)
{
int *b = new int[MAX+200];
MAX+=200;
for(int i=0; i<len; i++)
b[i]=ary[i];
delete ary;
ary=b;
}
ary[len]=x;
len++;
adjust_on(len-1);
}
bool empty()///判空
{
if(len==0)
return true;
else
return false;
}
int size()///返回队列的大小
{
return len;
}
~priority_queue() {};
};
int main()
{
int n;
priority_queue pq;
cin>>n;
int tmp;
for(int i=0; i<n; i++)
{
cin>>tmp;
pq.push(tmp);
}
for(int i=0; i<n; i++)
{
cout<<pq.top()<<" ";
pq.pop();
}
return 0;
}
using namespace std;
class priority_queue///简单实现了整数的优先队列(数越小优先值越大)
{
private:
int *ary;
int len;
int MAX;
void adjust_down(int st)///向下调整堆
{
while(st<len)
{
int ans=st;
if(st*2+1<len&&ary[ans]>ary[st*2+1])
ans=st*2+1;
if(st*2+2<len&&ary[ans]>ary[st*2+2])
ans=st*2+2;
if(ans==st)
return;
else
{
swap(ary[st],ary[ans]);
st=ans;
}
}
}
void adjust_on(int st)///向上调整堆
{
while(st>0)
{
int ans=st;
if(ary[st]<ary[(st-1)/2])
ans=(st-1)/2;
if(st==ans)
return;
else
{
swap(ary[st],ary[ans]);
st=ans;
}
}
}
public:
priority_queue()
{
MAX=100;
ary = new int[MAX];
len=0;
}
bool pop()///删除元素
{
if(empty())
return false;
swap(ary[0],ary[len-1]);
--len;
adjust_down(0);
return true;
}
int top()///得到队头元素
{
return ary[0];
}
void push(int x)///插入数据
{
if(len==MAX)
{
int *b = new int[MAX+200];
MAX+=200;
for(int i=0; i<len; i++)
b[i]=ary[i];
delete ary;
ary=b;
}
ary[len]=x;
len++;
adjust_on(len-1);
}
bool empty()///判空
{
if(len==0)
return true;
else
return false;
}
int size()///返回队列的大小
{
return len;
}
~priority_queue() {};
};
int main()
{
int n;
priority_queue pq;
cin>>n;
int tmp;
for(int i=0; i<n; i++)
{
cin>>tmp;
pq.push(tmp);
}
for(int i=0; i<n; i++)
{
cout<<pq.top()<<" ";
pq.pop();
}
return 0;
}
相关文章推荐
- 6.3.2 最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
- dijkastra 基于优先队列
- 算法导论——优先队列(基于堆排序)
- 基于优先队列PriorityQueue的Dijstra算法之Java实现
- 最小堆及基于最小堆的最小优先队列
- 最小生成树之Prime算法(基于优先队列)
- 排序算法——优先队列(基于堆得优先队列)
- 最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
- 6.3.2 最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
- 基于邻接矩阵的Dijkstra和基于优先队列的Dijkstra算法
- 基于最大堆实现最大优先队列
- [算法学习笔记]基于最大堆实现最大优先队列
- 小程序(4)——优先队列(基于静态数组的最小堆实现)
- 基于堆的优先队列
- 基于Java优先队列API(PriorityQueue)构建哈夫曼树
- 一种新的排序算法,基于优先队列
- POJ 3635 基于优先队列的BFS
- 改进基于优先队列的最短路径搜索『洪水流思想的体现』
- C++基于优先队列基础的prime算法
- 基于文本模式的HTML浏览器