Cod sursa(job #1049819)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 7 decembrie 2013 20:27:18
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#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;
}