学习了一下堆排序,记录一下实现优先队列的代码:
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair<int,int>
using namespace std;
const int maxn=1e5+5,mod=1e9 + 7;
class Priority_queue{
public:
int a[maxn] , sz = 0;
Priority_queue(){
sz = 0;
}
void pushup(int now){
if(now == 0){
return ;
}
int pre = (now - 1) / 2;
if(a[now] < a[pre]){
swap(a[now] , a[pre]);
pushup(pre);
}
}
void pushdown(int now){
if(now >= sz) return ;
int left = now * 2 + 1;
int right = now * 2 + 2;
int mi = now;
if(left < sz && a[now] > a[left]){
swap(a[now] , a[left]);
mi = left;
pushdown(mi);
}
if(right < sz && a[now] >a[right]){
swap(a[now] , a[right]);
mi = right;
pushdown(mi);
}
}
void push(int x){
a[sz++] = x;
pushup(sz - 1);
}
int top(){
if(sz == 0) return -1;
return a[0];
}
int pop(){
swap(a[0] , a[sz - 1]);
sz--;
pushdown(0);
}
int size(){
return sz;
}
};
int main(){
Priority_queue que;
for(int i = 0 ,x; i < 100; i ++){
scanf("%d",&x);
que.push(x);
for(int i = 0; i < que.size(); i ++){
printf ("%d ",que.a[i]);
}
printf ("\n");
if(que.size() > 7) que.pop();
for(int i = 0; i < que.size(); i ++){
printf ("%d ",que.a[i]);
}
printf ("\n");
}
return 0;
}
/*
-10 1 3 1 4 10 3 9 4 5 1
*/