ipsort.f

SUBROUTINE IPSORT (IX, N, IPERM, KFLAG, IER)
C***BEGIN PROLOGUE  IPSORT
C***PURPOSE  Return the permutation vector generated by sorting a given
C            array and, optionally, rearrange the elements of the array.
C            The array may be sorted in increasing or decreasing order.
C            A slightly modified quicksort algorithm is used.
C***LIBRARY   SLATEC
C***CATEGORY  N6A1A, N6A2A
C***TYPE      INTEGER (SPSORT-S, DPSORT-D, IPSORT-I, HPSORT-H)
C***KEYWORDS  NUMBER SORTING, PASSIVE SORTING, SINGLETON QUICKSORT, SORT
C***AUTHOR  Jones, R. E., (SNLA)
C           Kahaner, D. K., (NBS)
C           Wisniewski, J. A., (SNLA)
C***DESCRIPTION
C
C   IPSORT returns the permutation vector IPERM generated by sorting
C   the array IX and, optionally, rearranges the values in IX.  IX may
C   be sorted in increasing or decreasing order.  A slightly modified
C   quicksort algorithm is used.
C
C   IPERM is such that IX(IPERM(I)) is the Ith value in the
C   rearrangement of IX.  IPERM may be applied to another array by
C   calling IPPERM, SPPERM, DPPERM or HPPERM.
C
C   The main difference between IPSORT and its active sorting equivalent
C   ISORT is that the data are referenced indirectly rather than
C   directly.  Therefore, IPSORT should require approximately twice as
C   long to execute as ISORT.  However, IPSORT is more general.
C
C   Description of Parameters
C      IX - input/output -- integer array of values to be sorted.
C           If ABS(KFLAG) = 2, then the values in IX will be
C           rearranged on output; otherwise, they are unchanged.
C      N  - input -- number of values in array IX to be sorted.
C      IPERM - output -- permutation array such that IPERM(I) is the
C              index of the value in the original order of the
C              IX array that is in the Ith location in the sorted
C              order.
C      KFLAG - input -- control parameter:
C            =  2  means return the permutation vector resulting from
C                  sorting IX in increasing order and sort IX also.
C            =  1  means return the permutation vector resulting from
C                  sorting IX in increasing order and do not sort IX.
C            = -1  means return the permutation vector resulting from
C                  sorting IX in decreasing order and do not sort IX.
C            = -2  means return the permutation vector resulting from
C                  sorting IX in decreasing order and sort IX also.
C      IER - output -- error indicator:
C          =  0  if no error,
C          =  1  if N is zero or negative,
C          =  2  if KFLAG is not 2, 1, -1, or -2.
C***REFERENCES  R. C. Singleton, Algorithm 347, An efficient algorithm
C                 for sorting with minimal storage, Communications of
C                 the ACM, 12, 3 (1969), pp. 185-187.
C***ROUTINES CALLED  XERMSG
C***REVISION HISTORY  (YYMMDD)
C   761101  DATE WRITTEN
C   761118  Modified by John A. Wisniewski to use the Singleton
C           quicksort algorithm.
C   810801  Further modified by David K. Kahaner.
C   870423  Modified by Gregory S. Rhoads for passive sorting with the
C           option for the rearrangement of the original data.
C   890620  Algorithm for rearranging the data vector corrected by R.
C           Boisvert.
C   890622  Prologue upgraded to Version 4.0 style by D. Lozier.
C   891128  Error when KFLAG.LT.0 and N=1 corrected by R. Boisvert.
C   920507  Modified by M. McClain to revise prologue text.
C   920818  Declarations section rebuilt and code restructured to use
C           IF-THEN-ELSE-ENDIF.  (SMR, WRB)
C***END PROLOGUE  IPSORT