Pagini recente » Cod sursa (job #2113481) | Cod sursa (job #2711699) | Cod sursa (job #655584) | Cod sursa (job #1228243) | Cod sursa (job #1631867)
program heaps;
const Nmax = 500005;
var f, g:text;
v:array[1..Nmax] of longint;
i, n, aux:longint;
bufin, bufout:array[1..1 shl 16] of byte;
procedure interschimb(var a:longint; var b:longint);
var aux:longint;
begin
aux := a; a := b; b := aux;
end;
function father(nod:longint):longint;
begin
father := nod div 2;
end;
function left(nod:longint):longint;
begin
left := nod * 2;
end;
function right(nod:longint):longint;
begin
right := nod * 2 + 1;
end;
procedure down(n,k:longint);
var son, aux:longint;
begin
repeat
son := 0;
//fiu > tata
if (left(k) <= n) then
begin
son := left(k); //stanga, daca e mai mare ramane, altfel dreapta.
if (right(k) <= n) and (v[right(k)] > v[left(k)]) then son := right(k);
if v[son] <= v[k] then son := 0; //cond de oprire
end;
//interschimb
if (son <> 0) then
begin
interschimb(v[k], v[son]);
k := son; //trec la urm
end;
until son = 0;
end;
procedure build;
var i:longint;
begin
for i := n div 2 downto 1 do
down(n, i);
end;
begin
assign(f, 'algsort.in'); reset(f);
assign(g, 'algsort.out'); rewrite(g);
settextbuf(f, bufin); settextbuf(g, bufout);
readln(f, n);
for i := 1 to n do read(f, v[i]);
build();
//sortare in sine
for i := n downto 2 do
begin
aux := v[1];
v[1] := v[i];
v[i] := aux;
down(i - 1, 1);
end;
for i := 1 to n do write(g, v[i],' ');
close(f); close(g);
end.