program ShellSort;

{ Der Shellsort-Algorithmus. Der Divisor für den Abstand kann als Konstante
 geändert werden. }

const
   TableSize  = 20;
   GapDivisor = 2;

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

procedure ShlSort;
var
   Gap	 : LongInt;
   x	 : LongInt;
   Index : LongInt;
   j	 : LongInt;
begin
   Gap := TableSize div GapDivisor;
   while Gap > 0 do
   begin
      for Index := Gap + 1 to TableSize do
      begin
	 j := Index - Gap;
	 while j > 0 do
	 begin
	    if Table[j] <= Table[j + Gap] then
	       j := 0
	    else
	    begin
	       x := Table[j];
	       Table[j] := Table[j + Gap];
	       Table[j + Gap] := x;
	    end;
	    Dec(j,Gap);
	 end;
      end;
      Gap := Gap div GapDivisor;
   end;
end;

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