program quicksort_test_auf_Zeitverhalten;    (* mit Median = a[R] *)

     (* Sortiern von 5000 word's aus der Datei 'sorting.int' *)

uses crt,dos;

const  maxN  = 10000;
       Datei = 'c:sorting.int';

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


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_strings( ab:integer);
var i : integer;
begin
 for i:=ab to N do  write(a[i],'   ');
 writeln;writeln('*** ende *** ');
end;


procedure quicksort_test(L,R :integer);
var i,j       : integer;
    t,v       : word;          (* v ist der kÜnstliche Median *)
begin
if L<R then
 begin
   v:=a[R];
   i:=L-1;
   j:=R;
   repeat
     repeat  inc(i)  until ( a[i] >= v );
     repeat  dec(j)  until ( a[j] <= v );
     t:=a[i];  a[i]:=a[j];  a[j]:=t;
   until j<=i;
   a[j]:=a[i];
   a[i]:=a[R];
   a[R]:=t;
   quicksort_test(L,i-1);
   quicksort_test(i+1,R);
 end;
end;



var h,m,s,s1  :word;
begin
 clrscr;
 writeln('   ****************************************************************');
 writeln('   *                                                              *');
 writeln('   *      quicksort : Test auf Zeitverhalten beim Sortieren       *');
 writeln('   *                  von 5000 word''s                             *');
 writeln('   *                                                              *');
 writeln('   ****************************************************************');
 writeln;writeln;
 writeln('Es erfolgt jetzt das Einlesen der ',maxN,' Zahlen aus ',Datei,' .');
 lies_words_von_datei(Datei);
 clrscr;

 writeln('Fertig ! Jetzt wird sortiert .');
 gettime(h,m,s,s1);
 writeln('Anfang  :  ', h, ':' ,m, ':' ,s, '.' , s1 );
 writeln;
 quicksort_test(1,N);
 gettime(h,m,s,s1);
 writeln('Ende    :  ', h, ':' ,m, ':' ,s, '.' , s1 );
 readln;

 print_strings(N-150);  readln;
end.