program Heapsort;

{ Es ist 3:02 Uhr, und ich fange an, Heapsort zu schreiben... }

const
   TableSize = 10;

var
   Table : Array[1..TableSize] of Byte;
   Index : LongInt;

procedure Sift(L, R : LongInt);
var
   i, j	: LongInt;
   x	: Byte;
begin
   i := L;
   j := 2 * L;
   x := Table[i];
   if (j < R) and (Table[j + 1] > Table[j]) then Inc(j);
   while (j <= R) and (Table[j] > x) do
   begin
      Table[i] := Table[j];
      i := j;
      j := j * 2;
      if (j < R) and (Table[j + 1] > Table[j]) then Inc(j);
   end;
   Table[i] := x;
end;

procedure HSort;
var
   L, R	 : LongInt;
   Index : LongInt;
   x	 : Byte;
begin
   L := (TableSize div 2) + 1;
   R := TableSize;
   while (L > 1) do
   begin
      Dec(L);
      Sift(L,R);
   end;
   for Index := R downto 1 do
   begin
      x := Table[1];
      Table[1] := Table[Index];
      Table[Index] := x;
      Sift(1,Index - 1);
   end;
end;

begin
   Randomize;
   for Index := 1 to TableSize do
   begin
      Table[Index] := Random(100);
      Write(Table[Index]:2,' ');
   end;
   Writeln;
   HSort;
   for Index := 1 to TableSize do Write(Table[Index]:2,' ');
   Writeln;
end.
