(* KINDLY PROVIDED BY UNIVERSITY OF SURREY *)
PROGRAM TESTSORT(INPUT,OUTPUT,FILEIN); 
CONST 
A=200;
TYPE STRING= PACKED ARRAY [1..40] OF CHAR;
VAR 
 
BOOK: PACKED ARRAY[0..A] OF STRING;
LAST:INTEGER;
FILEIN: TEXT; 
PROCEDURE INPUTT; 
VAR 
FILENAME:STRING;
I:INTEGER; 
BEGIN 
I:=0; 
 PAGE;
WRITE('Please Enter Filename : ');
READ(FILENAME); 
 WRITELN;
RESET(FILEIN,FILENAME); 
WHILE NOT EOF(FILEIN) DO 
BEGIN 
I:=SUCC(I); 
READLN(FILEIN,BOOK[I]); 
END; 
LAST:=I;
END; 
PROCEDURE SWAP(LOW,HIGH:INTEGER);        
VAR 
TEMP:STRING;
BEGIN 
TEMP:=BOOK[LOW]; 
BOOK[LOW]:=BOOK[HIGH]; 
BOOK[HIGH]:=TEMP; 
END; 
PROCEDURE QUICKSORT(FIRST,LAST:INTEGER);
VAR LOW,HIGH,MIDDLE:INTEGER; 
BEGIN 
IF FIRST<LAST THEN 
BEGIN  
MIDDLE:=(FIRST+LAST) DIV 2; 
LOW:=FIRST; 
 
 WRITE('.');
HIGH:=LAST; 
REPEAT 
WHILE BOOK[MIDDLE]>BOOK[LOW]DO 
LOW:=LOW+1; 
 WHILE BOOK[HIGH]>BOOK[MIDDLE]DO
HIGH:=HIGH-1; 
IF LOW<=HIGH THEN 
BEGIN 
SWAP(LOW,HIGH); 
LOW:=LOW+1; 
HIGH:=HIGH-1; 
END; 
UNTIL LOW>HIGH; 
QUICKSORT(FIRST,HIGH); 
QUICKSORT(LOW,LAST); 
END; 
END; 
PROCEDURE DISPLAY(LAST:INTEGER);
VAR B: INTEGER; 
BEGIN 
B:=0; 
REPEAT 
B:=B+1; 
WRITE(BOOK[B]);
 UNTIL LAST=B;
END; 
 
 
BEGIN 
INPUTT; 
WRITE('Sorting ');
QUICKSORT(1,LAST);
QUICKSORT(1,LAST);
 WRITELN;
DISPLAY(LAST);
 WRITELN; WRITELN('Number of lines sorted : ',LAST);  
END. 
