Pagini recente » Cod sursa (job #2107726) | Cod sursa (job #1557708) | Cod sursa (job #133884) | Cod sursa (job #1057814) | Cod sursa (job #1255289)
/// heap sort cu heap iterativ, de mana
#include<cstdio>
const int N=500000;
const int INF=(1<<31)-1;
int min(int a,int b){
if(a<b)
return a;
return b;
}
class MinHeap{
public:
int v[2*N+2];
int l;
void build(){
l=0;
for(int i=0;i<=N;i++)
v[i]=INF;
}
bool empty(){
return l==0;
}
int top(){
return v[1];
}
void push(int x){
v[++l]=x;
int p=l;
while(p>1&&v[p]<v[p/2]){
change(p,p/2);
p/=2;
}
}
void pop(){
v[1]=v[l--];
v[l+1]=INF;
int p=1;
while(min(v[p*2],v[p*2+1])<v[p]){
if(v[p*2]<v[p*2+1]){
change(p,p*2);
p*=2;
}
else{
change(p,p*2+1);
p=p*2+1;
}
if(p>N)
break;
}
}
private:
void change(int p1,int p2){
int aux=v[p1];
v[p1]=v[p2];
v[p2]=aux;
}
};
MinHeap h;
int n;
int main(){
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d",&n);
h.build();
for(int i=1;i<=n;i++){
int nr;
scanf("%d",&nr);
h.push(nr);
}
int op=0;
while(!h.empty()){
printf("%d ",h.top());
h.pop();
}
return 0;
}