Pagini recente » Cod sursa (job #2252289) | Cod sursa (job #355396) | Cod sursa (job #2000514) | Cod sursa (job #922984) | Cod sursa (job #2470909)
#include <iostream>
#include <stdio.h>
using namespace std;
const int MAX_HEAP_SIZE = 32768;
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()
{
freopen ( "algsort.in", "r", stdin );
freopen ( "algsort.out", "w", stdout );
int n;
int i;
scanf ( "%d", &n );
for ( i = 1; i <= n; i ++ )
scanf ( "%d", &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 ++ )
printf ( "%d ", Heap[i] );
return 0;
}