Pagini recente » Cod sursa (job #1893198) | Cod sursa (job #2798842) | Cod sursa (job #93018) | Cod sursa (job #3167669) | Cod sursa (job #1049819)
#include<algorithm>
#include<fstream>
#define maxn 500005
using namespace std;
ifstream fi("algsort.in");
ofstream fo("algsort.out");
int h[maxn],n;
void down_heap(int n,int k){
int son=1;
while(son){
son=0;
if(2*k<=n){
son=2*k;
if(2*k+1<=n && h[2*k+1]>h[2*k]) son=2*k+1;
if(h[son]>h[k]){
swap(h[son],h[k]);
k=son;
}
else son=0;
}
}
}
void up_heap(int n,int k){
int q=h[k];
while((k>1) && q>h[k/2]){
h[k]=h[k/2];
k/=2;
}
h[k]=q;
}
void delete_heap(int &n,int k){
h[k]=h[n--];
if((k>1) && h[k]>h[k/2]) up_heap(n,k);
else down_heap(n,k);
}
void creare_max_heap(int n){
int i;
for(i=1;i<=n;i++) fi>>h[i];
for(i=n/2;i>0;i--) down_heap(n,i);
}
void heapsort(int n){
int i;
for(i=n;i>=2;i--){
swap(h[1],h[i]);
down_heap(i-1,1);
}
}
void afisare(int n){
int i;
for(i=1;i<=n;i++) fo<<h[i]<<" ";
}
int main(){
fi>>n;
creare_max_heap(n);
heapsort(n);
afisare(n);
fi.close();
fo.close();
return 0;
}