Pagini recente » Cod sursa (job #2976991) | Cod sursa (job #2889349) | Cod sursa (job #1030020) | Cod sursa (job #3211976) | Cod sursa (job #1915509)
#include <iostream>
#include <stdio.h>
#define MAXN 500003
#define inFile "algsort.in"
#define outFile "algsort.out"
using namespace std;
int Heap[MAXN], index;
int n;
inline int Tata(int k)
{
return (k >> 1);
}
inline int FiuD(int k)
{
return (k << 1) + 1;
}
inline int FiuS(int k)
{
return (k << 1);
}
template <typename T>
inline void swap1(T& a, T& b)
{
T aux = a; a = b; b = aux;
}
void Sus(int k)
{
while (Tata(k) >= 1 && Heap[k] < Heap[Tata(k)])
{
swap(Heap[k], Heap[Tata(k)]);
k /= 2;
}
}
void Jos(int k, int n)
{
int Fiu; /* Fiul unde incerc sa merg */
while (true)
{
Fiu = 0; /* Initial nu am niciun fiu valid, urmeaza sa aleg fiul cu valoarea minima */
if (FiuS(k) <= n) Fiu = FiuS(k); /* Aleg fiul din stanga initial, daca exista */
if (FiuD(k) <= n && Heap[Fiu] > Heap[FiuD(k)]) Fiu = FiuD(k); /* Incerc sa aleg fiul din dreapta, daca e mai mic */
if (Heap[k] > Heap[Fiu] && Fiu) /* Daca Tata este mai mare decati fiul SI am un fiu valid */
{
swap(Heap[k], Heap[Fiu]); /* Ii inteschimb */
k = Fiu; /* Fiul devine tata */
}
else return; /* Nu am nimic de actualizat, ma opresc */
}
}
void Adaugare(int x)
{
Heap[++index] = x; /* Adaug in Heap nodul x */
Sus(index); /* Si incerc sa-l urc cat pot de mult */
}
void HeapSort(void)
{
for (int i = n; i > 1; i--)
{
swap(Heap[1], Heap[i]); /* Interschimb priml nod cu ultimul */
Jos(1, i - 1); /* Si incerc sa-l cobor cat pot de mult */
}
}
void read(void)
{
FILE * f = fopen(inFile, "r");
fscanf(f, "%d", &n);
for(int i = 1, x; i <= n; i++)
{
fscanf(f, "%d", &x);
Adaugare(x);
}
fclose(f);
}
void write(void)
{
FILE * g = fopen(outFile, "w");
for (int i = n; i >= 1; i--)
{
fprintf(g, "%d ", Heap[i]);
}
fclose(g);
}
int main()
{
read();
HeapSort();
write();
return 0;
}