 
      SUBROUTINE CSORT(X,Y,N,KFLAG,WORK)
C***BEGIN PROLOGUE   CSORT
C***REVISION  MARCH 26,1985
C***CATEGORY NO.  M1A3
C***KEYWORD(S) STRING SORTING,SORT,SINGLETON QUICKSORT,QUICKSORT
C***DATE WRITTEN  NOVEMBER,1976
C***AUTHOR  JONES R.E., SULLIVAN F., WISNIEWSKI J.A.
C***PURPOSE
C         CSORT SORTS A STRING ARRAY X AND OPTIONALLY MAKES THE SAME
C         INTERCHANGES IN ARRAY Y.  THE ARRAY X MAY BE SORTED IN
C         FORWARD OR REVERSE LEXICOGRAPHIC ORDER.
C         A SLIGHTLY MODIFIED QUICKSORT ALGORITHM IS USED.
C***DESCRIPTION
C
C     ORIGINALLY WRITTEN BY (FOR REAL DATA) BY R.E. JONES
C     MODIFIED BY JOHN A. WISNIEWSKI TO USE THE SINGLETON QUICKSORT
C       ALGORITHM. DATE 18 NOVEMBER 1976.
C     MODIFIED BY FRANCIS SULLIVAN FOR STRING DATA, 1 OCTOBER 1981.
C     Documentation slightly modified by D. Kahaner, 26Mar,1985
C
C     ABSTRACT
C         CSORT SORTS A STRING ARRAY X AND OPTIONALLY MAKES THE SAME
C         INTERCHANGES IN ARRAY Y.  THE ARRAY X MAY BE SORTED IN
C         FORWARD OR REVERSE LEXICOGRAPHIC ORDER.
C         A SLIGHTLY MODIFIED QUICKSORT ALGORITHM IS USED.
C
C     REFERENCE
C         SINGLETON,R.C., ALGORITHM 347, AN EFFICIENT ALGORITHM FOR
C         SORTING WITH MINIMAL STORAGE, CACM,12(3),1969,185-7.
C
C     DESCRIPTION OF PARAMETERS
C         X - ARRAY OF TYPE CHARACTER TO BE SORTED
C         Y - ARRAY OF TYPE CHARACTER TO BE (OPTIONALLY) CARRIED
C             ELEMENTS OF THE ARRAYS X AND Y CAN BE DIFFERENT LENGTHS.
C             THIS WILL BE DETERMINED BY THE DECLARATIONS IN THE USERS
C             CALLING PROGRAM.  FOR  EXAMPLE, TO SORT A 100 ELEMENT
C             ARRAY OF NAMES, EACH OF LENGTH 6, DECLARE X AS
C             CHARACTER X(100)*6
C             MOST COMPUTERS HAVE AN UPPER LIMIT ON THE LENGTH OF
C             CHARACTER VARIABLES, FOR  EXAMPLE THIS IS
C                 SPERRY 1100 FTN FORTRAN -- 255
C                 CYBER   205 FORTRAN 200 -- 65535
C                 CYBER 170/180 FORTRAN 5 -- 32767
C         N - NUMBER OF VALUES IN ARRAY X TO BE SORTED
C         KFLAG - CONTROL PARAMETER
C             =2   SORT X IN LEXICOGRAPHIC ORDER AND CARRY Y ALONG.
C             =1   SORT X IN LEXICOGRAPHIC ORDER (IGNORING Y)
C             =-1  SORT X IN REVERSE LEXICOGRAPHIC ORDER (IGNORING Y)
C             =-2  SORT X IN REVERSE LEXICOGRAPHIC ORDER AND CARRY Y ALONG.
C         WORK - ARRAY OF LENGTH 4 OF TYPE CHARACTER USED INTERNALLY
C                FOR SCRATCH STORAGE.  NOTE, EACH ELEMENT OF WORK MUST
C                HAVE A LENGTH SPECIFICATION AT LEAST AS GREAT AS THAT
C                OF THE LARGER OF X AND Y (SEE EXAMPLE BELOW).
C
C     E X A M P L E  O F  U S E
C
C      CHARACTER*2 X,Y,W
C      DIMENSION X(10),W(4)
C      DATA (X(I),I=1,10)/ '05','I ',' I','  ','Rs','9R','R9','89','@*'
C     1 ,'N"'/
C      CALL CSORT(X,Y,10,1,W)
C      PRINT 100,(X(I),I=1,10)
C  100 FORMAT(2X,A2)
C      STOP
C      END
C
C***REFERENCE(S)
C         SINGLETON,R.C., ALGORITHM 347, AN EFFICIENT ALGORITHM FOR
C         SORTING WITH MINIMAL STORAGE, CACM,12(3),1969,185-7.
C***ROUTINES CALLED  XERROR
C***END PROLOGUE
C
      DIMENSION X(N),Y(N),IL(21),IU(21),WORK(4)
      CHARACTER X*(*),Y*(*),WORK*(*)
 
 
