program InsertionSort;

{ Der Insertionsort-Algorithmus mit linearer und binärer Suche. }

const
   TableSize = 10;

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

procedure InsSortLinear;
var
   Elem	 : LongInt;
   x	 : Byte;
   Index : LongInt;
begin
   for Elem := 2 to TableSize do
   begin
      x := Table[Elem];
      Index := Elem;
      while (Index > 1) and (Table[Index - 1] >= x) do
      begin
	 Table[Index] := Table[Index - 1];
	 Dec(Index);
      end;
      Table[Index] := x;
   end;
end;

procedure InsSortBinary;
var
   Elem	  : LongInt;
   L, R	  : LongInt;
   Middle : LongInt;
   Index  : LongInt;
   x	  : Byte;
begin
   for Elem := 2 to TableSize do
   begin
      x := Table[Elem];
      L := 1;
      R := Elem;
      while L < R do
      begin
	 Middle := (L + R) div 2;
	 if Table[Middle] > x then R := Middle
	 else if Table[Middle] < x then L := Middle + 1
	 else R := L;
      end;
      for Index := Elem downto L + 1 do Table[Index] := Table[Index - 1];
      Table[L] := x;
   end;
end;

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