Pagini recente » Cod sursa (job #2962249) | Cod sursa (job #1091624) | Cod sursa (job #28728) | Cod sursa (job #740714) | Cod sursa (job #1135859)
program heap;
const MAX_HEAP_SIZE = 500000;
var H : array [1..MAX_HEAP_SIZE] of longint;
k,i,n : longint;
function tata( nod : longint) : longint;
begin
tata:=nod div 2;
end;
function fiu_sting( nod : longint) : longint;
begin
fiu_sting:=nod * 2;
end;
function fiu_drept( nod : longint) : longint;
begin
fiu_drept:=nod * 2+1;
end;
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 fiu_sting(k)<n then
begin
fiu:=fiu_sting(k);
if H[fiu_drept(k)]>H[fiu_sting(k)] then fiu:=fiu_drept(k);
if H[fiu]<=H[k] then fiu:=0
end
else if fiu_sting(k)=n then
begin
fiu:=fiu_sting(k);
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[tata(k)])) do begin
H[k]:=H[tata(k)];
k:=tata(k);
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 sterge(var n : longint ; k : longint);
begin
H[k]:=H[n];
n:=n-1;
if ((k>1) and (H[k]>H[tata(k)])) then ridica(n,k)
else coboara(n,k);
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.