Pagini recente » Cod sursa (job #2803921) | Cod sursa (job #1281907) | Cod sursa (job #2862517) | Cod sursa (job #956759) | Cod sursa (job #1757456)
//HEAPSORT
#include <fstream>
#define NMAX 500100
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
typedef int HEAP[NMAX];
HEAP H;
int n;
void citire(){
f>>n;
int i;
for(i=1;i<=n;i++){
f>>H[i];
}
}
inline int father(int k){
return k/2;
}
inline int left_son(int k){
return 2*k;
}
inline int right_son(int k){
return 2*k+1;
}
void sift(int n,int k){
int son;
do{
son=0;
if(left_son(k)<=n){
son=left_son(k);
if(right_son(k)<=n&&H[son]<H[right_son(k)])
son=right_son(k);
if(H[son]<=H[k])
son=0;
}
if(son){
swap(H[son],H[k]);
k=son;
}
}while(son);
}
void perculate(int n,int k){
int key=H[k];
while((k>1)&&key>H[father(k)]){
H[k]=H[father(k)];
k=father(k);
}
H[k]=key;
}
void build_heap(int n,HEAP H){
int i;
for(i=n/2;i>=1;i--){
sift(n,i);
}
}
void heapsort(int n,HEAP H){
int i;
for(i=n;i>=2;i--){
swap(H[i],H[1]);
sift(i-1,1);
}
}
void afisare(int n,HEAP H){
int i;
for(i=1;i<=n;i++)
g<<H[i]<<' ';
}
int main(){
citire();
build_heap(n,H);
heapsort(n,H);
afisare(n,H);
return 0;
}