Pagini recente » Cod sursa (job #1122621) | Cod sursa (job #2639936) | Cod sursa (job #779382) | Cod sursa (job #2211143) | Cod sursa (job #344674)
Cod sursa(job #344674)
#include <stdio.h>
#define N (1<<19)
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);
}
inline int digit(char x)
{
return '0'<= x && x <='9';
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
int i;
scanf("%d\n", &n);
dim = n;
n=0;
char x,cif=0;
long long nr=0;
while (scanf("%c",&x)!=EOF)
if (digit(x))
{
nr=nr*10+x-'0';
cif=1;
}
else
if (cif)
{
heap[++n]=nr;
nr=0;
cif=0;
}
heapify();
for (i = 1; i <= dim; i++)
printf("%lld ", extrage_minim());
return 0;
}