home *** CD-ROM | disk | FTP | other *** search
- (* Stop recursion after size is 10 and use insertion sort *)
- PROGRAM Compsorts(Input,Output,File1);
- mscs55 #7b compare quick sorts.}
- CONST MaxSize = 8192;
- TYPE ArrayType = ARRAY[0..MaxSize] OF Integer;
- VAR B,C,D: ArrayType;
- StartTime, EndTime, Size: Integer;
- File1: Text;
-
- (*********************************************************)
- (* QuickSort-- Recursive version with drag *)
- (*********************************************************)
- PROCEDURE QuickSort (VAR A: ArrayType; Size:Integer);
-
- PROCEDURE Sort(L,R: Integer);
- VAR Temp, I, J, BegginValue: Integer;
- X,Logme: Integer;
- Log: Real;
-
- BEGIN
- I:= L;
- J:= R;
- BegginValue:= A[(L+R) DIV 2];
- REPEAT
- WHILE A[I] < BegginValue DO (* Search from left *)
- I:= I+1;
- WHILE A[J] > BegginValue DO (* Search from right *)
- J:= J-1;
- IF I<=J THEN
- BEGIN
- (* Drag Intoduced *)
- For X := 1 to 20 Do
- BEGIN
- LogMe := A[I + J] + X;
- Log := ln(Logme);
- END;
- (* Drag Concluded *)
- Temp:= A[I];
- A[I]:= A[J];
- A[J]:= Temp;
- I:= I+1;
- J:= J-1;
- END;
- UNTIL I >= J;
- IF L < J THEN Sort(L,J);
- IF I < R THEN Sort(I,R);
- END; (* Sort *)
- BEGIN
- Sort(1, Size);
- END;
-
-
- (*********************************************************)
- (* QuickSort-- Recursive version till reaches a *)
- (* certain size. *)
- (*********************************************************)
- PROCEDURE ReviseQuix(VAR A: ArrayType; Size:Integer);
-
- PROCEDURE RevSort(L,R: Integer);
- VAR Temp, I, J, BegginValue,Pass,
- Z,S: Integer;
- BEGIN
- I:= L;
- J:= R;
- IF (L+R) > 10 THEN (* if the remaining list is greater than *)
- (* a certain size do quicksort *)
- (* else do insertion sort *)
- BEGIN (* Quicksort *)
- BegginValue:= A[(L+R) DIV 2];
- REPEAT
- WHILE A[I] < BegginValue DO (* Search from left *)
- I:= I+1;
- WHILE A[J] > BegginValue DO (* Search from right *)
- J:= J-1;
- IF I<=J THEN
- BEGIN
- Temp:= A[I];
- A[I]:= A[J];
- A[J]:= Temp;
- I:= I+1;
- J:= J-1;
- END;
- UNTIL I >= J;
- IF L < J THEN RevSort(L,J);
- IF I < R THEN RevSort(I,R);
- END (* Quicksort *)
- ELSE
- FOR Pass:= L TO R DO (* Insert item 'Pass' *)
- BEGIN
- Z:= Pass;
- S:= A[Pass]; (* Copy item to be inserted *)
- WHILE S < A[Z-1] DO
- BEGIN
- A[Z]:= A[Z-1]; (* Move item down in list *)
- Z:= Z-1;
- END;
- A[Z]:= S; (* Perform Insertion *)
- END;
- END; (* Sort *)
- BEGIN
- RevSort(1, Size);
- END;
-
- BEGIN (******************* MAIN ***********************)
- Reset(File1);
- B[0]:= 0; (* Bumper for top of list *)
- Size:= 0;
- WHILE not Eof(File1) DO
- BEGIN
- Size:= Size + 1;
- Readln(File1,B[Size]);
- END;
- C:= B; D:= B;
-
- Writeln('Array Size: ',Size:0);
- Writeln;
-
- StartTime:= Clock;
- QuickSort (C, Size);
- EndTime:= Clock;
- Writeln('QuickTime with drag: ',EndTime-StartTime:0);
-
- StartTime := Clock;
- ReviseQuix(D, Size);
- EndTime:=Clock;
- Writeln('Revised QuickTime: ',EndTime-StartTime:0);
- END. (**************** COMPSORTS **********************)
-