Pagini recente » Cod sursa (job #886886) | Cod sursa (job #1343605) | Cod sursa (job #1658707) | Cod sursa (job #1099222) | Cod sursa (job #978956)
Cod sursa(job #978956)
#include <iostream>
#include <fstream>
using namespace std;
/*
MaxHeap
*/
#define Nmax 500003
#define Parent(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
#define Maxim(H) H[1]
void InitHeap( int *H )
{
for ( int i = 0; i < Nmax; ++i )
H[i] = 0;
}
void DownHeap( int *H, int N, int poz )
{
int k = poz;
int j = k;
do
{
j = k;
if ( LeftSon(j) <= N && H[LeftSon(j)] < H[k] ) k = LeftSon(j); // Schimba semnul pentru MinHeap
if ( RightSon(j)<= N && H[RightSon(j)] < H[k] ) k = RightSon(j); // Schimba semnul pentru MinHeap
swap( H[j], H[k] );
} while( j != k );
}
void UpHeap( int *H, int N, int poz )
{
int k = poz;
int j = k;
do
{
j = k;
if ( j > 1 && H[Parent(j)] > H[k] ) k = Parent(j); // Schimba semnul pentru MinHeap
swap( H[j], H[k] );
} while( j != k );
}
void InsertHeap( int *H, int &N, int key )
{
H[ ++N ] = key;
UpHeap( H, N, N );
}
void DeleteMax( int *H, int &N )
{
H[1] = H[N];
DownHeap( H, N, 1 );
N--;
}
int main()
{
int H[500004], n = 0, m, a;
ifstream f("algsort.in");
ofstream g("algsort.out");
InitHeap( H );
f >> m;
for ( int i = 0; i < m; ++i )
f >> a,
InsertHeap( H, n, a );
for ( int i = 0; i < m; ++i )
{
g << Maxim(H) << " ";
DeleteMax(H,n);
}
return 0;
}