Pagini recente » Cod sursa (job #1034916) | Cod sursa (job #2930547) | Cod sursa (job #934985) | Cod sursa (job #1256475) | Cod sursa (job #1706466)
#include <fstream>
#define NMAX 500005
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int n,H[NMAX];
inline int father(int nod){
return nod/2;
}
inline int leftSon(int nod){
return 2*nod;
}
inline int rightSon(int nod){
return 2*nod+1;
}
void sift(int n,int k,int H[]){
int son;
do{
son=0;
if(leftSon(k)<=n){
son=leftSon(k);
if(rightSon(k)<=n&&H[rightSon(k)]>H[son])
son=rightSon(k);
if(H[son]<=H[k])
son=0;
}
if(son){
swap(H[son],H[k]);
son=k;
}
}while(son);
}
void percolate(int n,int k,int H[]){
while(k>1&&H[father(k)]<H[k]){
swap(H[father(k)],H[k]);
k=father(k);
}
}
void build_heap(int n,int H[]){
for(int i=n/2;i>=1;i--)
sift(n,i,H);
}
void heap_sort(int n,int H[]){
build_heap(n,H);
for(int i=n;i>=2;i--){
swap(H[1],H[i]);
sift(i-1,1,H);
}
}
void citire(){
f>>n;
int i;
for(i=1;i<=n;++i)
f>>H[i];
}
void afisare(){
int i;
for(i=1;i<=n;i++)
g<<H[i]<<' ';
}
int main(){
citire();
//afisare();
heap_sort(n,H);
afisare();
return 0;
}