Pagini recente » Cod sursa (job #2366774) | Cod sursa (job #2043160) | Istoria paginii runda/12345678901/clasament | Cod sursa (job #601368) | Cod sursa (job #344676)
Cod sursa(job #344676)
#include <stdio.h>
#include <fstream.h>
#define in "algsort.in"
#define out "algsort.out"
#define N 1<<19
ifstream f(in);
ofstream g(out);
int n, dim;
long long heap[N];
void interschimba(int poz1, int poz2)
{
int temp = heap[poz1];
heap[poz1] = heap[poz2];
heap[poz2] = temp;
}
void muta_in_sus(int poz)
{
if (poz > 1 && heap[poz/2] > heap[poz])
{
interschimba(poz, poz/2);
muta_in_sus(poz/2);
}
}
void muta_in_jos(int poz)
{
if ((2*poz <= n && heap[poz] > heap[2*poz] ) ||
(2*poz+1<= n && heap[poz] > heap[2*poz+1]))
{
int maximum = 2*poz;
if (2*poz+1 <= n && heap[2*poz+1] < heap[2*poz])
maximum = 2*poz+1;
interschimba(poz, maximum);
muta_in_jos(maximum);
}
}
long long extrage_minim()
{
int ret = heap[1];
heap[1] = heap[n--];
muta_in_jos(1);
return ret;
}
void heapify()
{
int i;
for (i = n; i >=1; i--)
muta_in_jos(i);
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
int i;
scanf("%d", &n);
dim = n;
for (i = 1; i <= n; i++)
f>>heap[i];
heapify();
for (i = 1; i <= dim; i++)
g<<extrage_minim()<<' ';
return 0;
}