Pagini recente » Cod sursa (job #1724474) | Cod sursa (job #1278078) | Cod sursa (job #1747888) | Cod sursa (job #1047534) | Cod sursa (job #1631685)
program heaps;
const Nmax = 500005;
var f, g:text;
v:array[1..Nmax] of longint;
i, n, aux:longint;
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
aux := v[k];
v[k] := v[son];
v[son] := aux;
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);
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.