Pagini recente » Monitorul de evaluare | Cod sursa (job #3204943) | Istoria paginii runda/oni_clasa10_2022-2016/clasament | Cod sursa (job #1838809) | Cod sursa (job #1135861)
program heap;
const MAX_HEAP_SIZE = 500005;
var H : array [1..MAX_HEAP_SIZE] of longint;
i,n : longint;
procedure swap(var x,y : longint);
var aux : longint;
begin
aux:=x;
x:=y;
y:=aux;
end;
procedure coboara( n, k : longint);
var fiu : longint;
begin
repeat
fiu:=0;
if k*2<n then
begin
fiu:=k*2;
if H[k*2+1]>H[k*2] then fiu:=k*2+1;
if H[fiu]<=H[k] then fiu:=0
end
else if k*2=n then
begin
fiu:=k*2;
if H[fiu]<=H[k] then fiu:=0;
end;
if fiu<>0 then begin
swap(H[k],H[fiu]);
k:=fiu;
end;
until fiu=0;
end;
procedure ridica(n,k : longint);
var aux : longint;
begin
aux:=H[k];
while ((k<>1)and(aux>H[k div 2])) do begin
H[k]:=H[k div 2];
k:=k div 2;
end;
H[k]:=aux;
end;
procedure construieste(n : longint);
var i :longint;
begin
for i:=n div 2 downto 1 do
coboara(n,i);
end;
procedure heapsort(n : longint);
var i :longint; begin
for i:=n downto 2 do begin
swap(H[1],H[i]);
coboara(i-1,1);
end;
end;
begin
assign(input,'algsort.in'); reset(input);
assign(output,'algsort.out'); rewrite(output);
readln(n);
for i:=1 to n do read(H[i]);
construieste(n);
heapsort(n);
for i:=1 to n do write(H[i],' ');
close(input);
close(output);
end.