home *** CD-ROM | disk | FTP | other *** search
- ::::::::::
- QSORT.PRO
- ::::::::::
-
- -------- SIMTEL20 Ada Software Repository Prologue ------------
- -- -*
- -- Unit name : generic procedure SORT
- -- Version : 1.0
- -- Author : John A. Anderson
- -- : TEXAS INSTRUMENTS MS 8006
- -- : P.O. BOX 801
- -- : MCKINNEY, TEXAS 75069
- -- :
- -- DDN Address : ANDERSON%TI-EG at CSNET-RELAY
- -- Copyright : (c) 1984, 1985 John Anderson
- -- Date created : December 19, 1984
- -- Release Date : January 10, 1985
- -- Last update : ANDERSON Wed Dec 19, 1984
- -- Machine/System Compiled/Run on : DG MV 10000, Ada Development
- -- : Environment
- -- -*
- ---------------------------------------------------------------
- -- -*
- -- Abstract : This generic procedure uses the QuickSort
- ----------------: algorithm to sort an array of any base type
- ----------------: with any discrete index type.
- ----------------: Associated Files:
- ----------------: SORT.ADA -- generic Quick Sort
- ----------------: OTHERTEST.ADA -- test program (for any
- ----------------: generic sort with the same visible section
- ----------------:
- ------------------ Revision history ---------------------------
- --
- -- DATE AUTHOR HISTORY
- -- 10 Jan 85 John Anderson Initial Release
- --
- -------------------END-PROLOGUE--------------------------------
-
- ::::::::::
- SORT.ADA
- ::::::::::
-
-
- -------- SIMTEL20 Ada Software Repository Prologue ------------
- -- -*
- -- Unit name : generic procedure SORT
- -- Version : 1.0
- -- Author : John A. Anderson
- -- : TEXAS INSTRUMENTS MS 8006
- -- : P.O. BOX 801
- -- : MCKINNEY, TEXAS 75069
- -- :
- -- DDN Address : ANDERSON%TI-EG at CSNET-RELAY
- -- Copyright : (c) 1984, 1985 John Anderson
- -- Date created : December 19, 1984
- -- Release Date : January 10, 1985
- -- Last update : ANDERSON Wed Dec 19, 1984
- -- Machine/System Compiled/Run on : DG MV 10000, Ada Development
- -- : Environment
- -- -*
- ---------------------------------------------------------------
- -- -*
- -- Abstract : This generic procedure uses the QuickSort
- ----------------: algorithm to sort an array of any base type
- ----------------: with any discrete index type.
- ----------------: Associated Files:
- ----------------: SORT.ADA -- generic Quick Sort
- ----------------: OTHERTEST.ADA -- test program (for any
- ----------------: generic sort with the same visible section
- ----------------:
- ------------------ Revision history ---------------------------
- --
- -- DATE AUTHOR HISTORY
- -- 10 Jan 85 John Anderson Initial Release
- --
- -------------------END-PROLOGUE--------------------------------
- generic
- type ITEM is private;
-
- type INDEX is (<>);
-
- type ROW is array (INDEX range <>) of ITEM;
-
- with function "<" (X, Y : ITEM) return BOOLEAN is <>;
-
- procedure SORT (A : in out ROW);
-
-
- with TEXT_IO;
- procedure SORT (A : in out ROW) is
-
- procedure QSORT (L, R : INDEX) is
-
- I, J : INDEX;
- X : ITEM;
-
- procedure EXCHANGE (A, B : in out ITEM) is
- TEMP : ITEM;
- begin
- TEMP := A;
- A := B;
- B := TEMP;
- end EXCHANGE;
-
- begin
-
- I := L;
- J := R;
-
- X := A (INDEX'VAL ((INDEX'POS (L) + INDEX'POS (R)) / 2));
-
- MAIN:
- loop
-
- while A (I) < X loop
- I := INDEX'SUCC (I);
- end loop;
-
- while X < A (J) loop
- J := INDEX'PRED (J);
- end loop;
-
- if I <= J then
- EXCHANGE (A (I), A (J));
-
- begin
- I := INDEX'SUCC (I);
- J := INDEX'PRED (J);
- exception
- when CONSTRAINT_ERROR =>
- null; -- necessary to avoid exception raising
- end;
-
- end if;
-
- exit when I > J;
-
- end loop MAIN;
-
- if L < J then
- QSORT (L, J);
- end if;
-
- if I < R then
- QSORT (I, R);
- end if;
-
- end QSORT;
-
- begin
-
- QSORT (A'FIRST, A'LAST);
-
- exception
- when others =>
- TEXT_IO.PUT_LINE ("Exception raised in Generic Sort");
- raise;
- end SORT;
-
- ::::::::::
- OTHERTEST.ADA
- ::::::::::
-
- with SORT;
- with TEXT_IO;
- procedure OTHERTEST is
-
- MAX : constant INTEGER := 100;
- subtype INDEX_TYPE is INTEGER range 1 .. MAX;
- type MY_ARRAY_TYPE is array (INDEX_TYPE range <>) of INTEGER;
-
- OTHER_MAX : constant CHARACTER := 'Z';
- subtype OTHER_INDEX_TYPE is CHARACTER range 'A' .. 'Z';
- type OTHER_ARRAY_TYPE is array (OTHER_INDEX_TYPE range <>) of CHARACTER;
-
-
- MY_ARRAY : MY_ARRAY_TYPE (INDEX_TYPE);
- OTHER_ARRAY : OTHER_ARRAY_TYPE (OTHER_INDEX_TYPE);
-
- procedure MY_SORT is new SORT
- (ITEM => INTEGER, INDEX => INDEX_TYPE, ROW => MY_ARRAY_TYPE);
-
- procedure OTHER_SORT is new SORT
- (ITEM => CHARACTER,
- INDEX => OTHER_INDEX_TYPE,
- ROW => OTHER_ARRAY_TYPE);
-
- begin
-
- for NUM in INDEX_TYPE loop
- MY_ARRAY (NUM) := 1000 - NUM * 2;
- end loop;
-
- TEXT_IO.PUT_LINE ("The array consists of:");
- for NUM in INDEX_TYPE loop
- TEXT_IO.PUT_LINE (INTEGER'IMAGE (MY_ARRAY (NUM)));
- end loop;
-
- MY_SORT (MY_ARRAY (1 .. 50));
-
- TEXT_IO.PUT_LINE ("The array sorted 1..50 consists of:");
- for NUM in INDEX_TYPE loop
- TEXT_IO.PUT_LINE (INTEGER'IMAGE (MY_ARRAY (NUM)));
- end loop;
-
- MY_SORT (MY_ARRAY);
-
- TEXT_IO.PUT_LINE ("The array all sorted consists of:");
- for NUM in INDEX_TYPE loop
- TEXT_IO.PUT_LINE (INTEGER'IMAGE (MY_ARRAY (NUM)));
- end loop;
-
- -- load character array
- for CHAR in OTHER_INDEX_TYPE loop
- OTHER_ARRAY (CHAR) := CHARACTER'VAL
- (CHARACTER'POS ('Z') - CHARACTER'POS (CHAR) +
- CHARACTER'POS ('A'));
- end loop;
-
- TEXT_IO.PUT_LINE ("The character array consists of:");
- for CHAR in OTHER_INDEX_TYPE loop
- TEXT_IO.PUT (OTHER_ARRAY (CHAR));
- TEXT_IO.NEW_LINE;
- end loop;
-
- OTHER_SORT (OTHER_ARRAY ('A' .. 'M'));
-
- TEXT_IO.PUT_LINE ("The array sorted A - M is");
-
- for CHAR in OTHER_INDEX_TYPE loop
- TEXT_IO.PUT (OTHER_ARRAY (CHAR));
- TEXT_IO.NEW_LINE;
- end loop;
-
- OTHER_SORT (OTHER_ARRAY);
-
- TEXT_IO.PUT_LINE ("The character array sorted is");
-
- for CHAR in OTHER_INDEX_TYPE loop
- TEXT_IO.PUT (OTHER_ARRAY (CHAR));
- TEXT_IO.NEW_LINE;
- end loop;
-
- exception
- when others =>
- TEXT_IO.PUT_LINE ("Error in Main Program");
- end OTHERTEST;
-
-