Cod sursa(job #2470938)

Utilizator andreic06Andrei Calota andreic06 Data 9 octombrie 2019 21:19:18
Problema Sortare prin comparare Scor 0
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MAX_HEAP_SIZE = 524288;
int Heap[MAX_HEAP_SIZE];

int father ( int poz ){
      return poz / 2;
}

int left_son ( int poz ){
      return poz * 2;
}

int right_son ( int poz ){
      return poz * 2 + 1;
}

void sift ( int H[], int n, int k ){ /// log n
    int son;

    do {
       son = 0;
       if ( left_son ( k ) <= n ){ /// pozitie valabila
         son = left_son ( k ); /// presupun ca fiul stang este cel care trebuie interschimbat
         if ( right_son ( k ) <= n && H[right_son ( k ) ] > H[son] )
           son = right_son ( k ); /// il punem pe cel mai mare fiu ca fiind noul tata
         if ( H[son] <= H[k] ) /// nu am de ce sa interschimb
           son = 0;
       }

       if ( son ) { /// son > 0 => are sens sa interschimb
         swap ( H[son], H[k] );
         k = son; /// trec la urmatorul in functie de ce am gasit
       }
    }while ( son );
}

void build_heap ( int H[], int n ){

   int i;
   for ( i = n / 2; i > 0; i -- )
      sift ( H, n, i );
}

int main()
{

   ifstream fin( "algsort.in" );
   ofstream fout( "algsort.out" );

   int n;
   int i;

   fin >> n;

   for ( i = 1; i <= n; i ++ )
      fin >> Heap[i];



   /// heap sort !!!!


   build_heap ( Heap, n ); /// incredibil N * LOG N memorie O ( n ) *ALWAYS*
   for ( i = n; i >= 2; i -- ){
      swap ( Heap[i], Heap[1] );
      sift ( Heap, i - 1, 1 );
   }
   for ( i = 1; i <= n; i ++ )
      fout << Heap[i] << " ";