program shell_sort_test_auf_Zeitverhalten;
uses crt,dos;

const  maxN = 5000;

var a  : array[1..maxN] of word;
    N  : integer;                    (* Anzahl der eingegeben Zahlen *)


procedure lies_words_von_datei(datei : string);
var dat : file of word;
    i   : word;
begin
 i:=0;
 assign(dat,datei);
 reset(dat);
 if not eof(dat) then
   repeat
    i:=i+1;
    read(dat,a[i]);
   until eof(dat);
 N:=i;
 close(dat);
end;





procedure print_words( ab:integer);
var i : integer;
begin
 for i:=ab to N do  write(a[i],' ');
 writeln;
 writeln('*** ende *** ');
end;


procedure shellsort_test;
label 0;
var i,j,h  : integer;
    v      : word;
begin
 h:=1;
 repeat  h:=3*h+1  until h>N;
 repeat
   h:=h div 3;
   for i:=h+1 to N do
    begin
      v:=a[i];
      j:=i;
      while (a[j-h] > v)  do
       begin
         a[j]:=a[j-h];
         j:=j-h;
         if j<=h then goto 0
       end;
0:    a[j]:=v;
    end;
 until h=1;
end;

var h,m,s,s1 : word;
begin
 clrscr;
 writeln('    Shell-Sort  : Test auf Zeitverhalten beim ');
 writeln('                  Sortieren von 5000 Zahlen .');
 writeln;writeln;
 writeln('Es erfolgt jetzt das Einlesen der 5000 Zahlen . ');
 writeln;
 lies_words_von_datei('sorting.int');
 writeln('Fertig ! Jetzt wird sortiert . ');writeln;writeln;
 gettime(h,m,s,s1);
 writeln(h, ':' ,m, ':' ,s, '.' ,s1 );
 writeln;writeln;
 shellsort_test;
 gettime(h,m,s,s1);
 writeln(h, ':' ,m, ':' ,s, '.' ,s1 );
 writeln;writeln;
 readln;
 print_words(4800);
 readln;
end.