Annotation of rpl/lapack/lapack/dlasrt.f, revision 1.1

1.1     ! bertrand    1:       SUBROUTINE DLASRT( ID, N, D, INFO )
        !             2: *
        !             3: *  -- LAPACK routine (version 3.2) --
        !             4: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
        !             5: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !             6: *     November 2006
        !             7: *
        !             8: *     .. Scalar Arguments ..
        !             9:       CHARACTER          ID
        !            10:       INTEGER            INFO, N
        !            11: *     ..
        !            12: *     .. Array Arguments ..
        !            13:       DOUBLE PRECISION   D( * )
        !            14: *     ..
        !            15: *
        !            16: *  Purpose
        !            17: *  =======
        !            18: *
        !            19: *  Sort the numbers in D in increasing order (if ID = 'I') or
        !            20: *  in decreasing order (if ID = 'D' ).
        !            21: *
        !            22: *  Use Quick Sort, reverting to Insertion sort on arrays of
        !            23: *  size <= 20. Dimension of STACK limits N to about 2**32.
        !            24: *
        !            25: *  Arguments
        !            26: *  =========
        !            27: *
        !            28: *  ID      (input) CHARACTER*1
        !            29: *          = 'I': sort D in increasing order;
        !            30: *          = 'D': sort D in decreasing order.
        !            31: *
        !            32: *  N       (input) INTEGER
        !            33: *          The length of the array D.
        !            34: *
        !            35: *  D       (input/output) DOUBLE PRECISION array, dimension (N)
        !            36: *          On entry, the array to be sorted.
        !            37: *          On exit, D has been sorted into increasing order
        !            38: *          (D(1) <= ... <= D(N) ) or into decreasing order
        !            39: *          (D(1) >= ... >= D(N) ), depending on ID.
        !            40: *
        !            41: *  INFO    (output) INTEGER
        !            42: *          = 0:  successful exit
        !            43: *          < 0:  if INFO = -i, the i-th argument had an illegal value
        !            44: *
        !            45: *  =====================================================================
        !            46: *
        !            47: *     .. Parameters ..
        !            48:       INTEGER            SELECT
        !            49:       PARAMETER          ( SELECT = 20 )
        !            50: *     ..
        !            51: *     .. Local Scalars ..
        !            52:       INTEGER            DIR, ENDD, I, J, START, STKPNT
        !            53:       DOUBLE PRECISION   D1, D2, D3, DMNMX, TMP
        !            54: *     ..
        !            55: *     .. Local Arrays ..
        !            56:       INTEGER            STACK( 2, 32 )
        !            57: *     ..
        !            58: *     .. External Functions ..
        !            59:       LOGICAL            LSAME
        !            60:       EXTERNAL           LSAME
        !            61: *     ..
        !            62: *     .. External Subroutines ..
        !            63:       EXTERNAL           XERBLA
        !            64: *     ..
        !            65: *     .. Executable Statements ..
        !            66: *
        !            67: *     Test the input paramters.
        !            68: *
        !            69:       INFO = 0
        !            70:       DIR = -1
        !            71:       IF( LSAME( ID, 'D' ) ) THEN
        !            72:          DIR = 0
        !            73:       ELSE IF( LSAME( ID, 'I' ) ) THEN
        !            74:          DIR = 1
        !            75:       END IF
        !            76:       IF( DIR.EQ.-1 ) THEN
        !            77:          INFO = -1
        !            78:       ELSE IF( N.LT.0 ) THEN
        !            79:          INFO = -2
        !            80:       END IF
        !            81:       IF( INFO.NE.0 ) THEN
        !            82:          CALL XERBLA( 'DLASRT', -INFO )
        !            83:          RETURN
        !            84:       END IF
        !            85: *
        !            86: *     Quick return if possible
        !            87: *
        !            88:       IF( N.LE.1 )
        !            89:      $   RETURN
        !            90: *
        !            91:       STKPNT = 1
        !            92:       STACK( 1, 1 ) = 1
        !            93:       STACK( 2, 1 ) = N
        !            94:    10 CONTINUE
        !            95:       START = STACK( 1, STKPNT )
        !            96:       ENDD = STACK( 2, STKPNT )
        !            97:       STKPNT = STKPNT - 1
        !            98:       IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN
        !            99: *
        !           100: *        Do Insertion sort on D( START:ENDD )
        !           101: *
        !           102:          IF( DIR.EQ.0 ) THEN
        !           103: *
        !           104: *           Sort into decreasing order
        !           105: *
        !           106:             DO 30 I = START + 1, ENDD
        !           107:                DO 20 J = I, START + 1, -1
        !           108:                   IF( D( J ).GT.D( J-1 ) ) THEN
        !           109:                      DMNMX = D( J )
        !           110:                      D( J ) = D( J-1 )
        !           111:                      D( J-1 ) = DMNMX
        !           112:                   ELSE
        !           113:                      GO TO 30
        !           114:                   END IF
        !           115:    20          CONTINUE
        !           116:    30       CONTINUE
        !           117: *
        !           118:          ELSE
        !           119: *
        !           120: *           Sort into increasing order
        !           121: *
        !           122:             DO 50 I = START + 1, ENDD
        !           123:                DO 40 J = I, START + 1, -1
        !           124:                   IF( D( J ).LT.D( J-1 ) ) THEN
        !           125:                      DMNMX = D( J )
        !           126:                      D( J ) = D( J-1 )
        !           127:                      D( J-1 ) = DMNMX
        !           128:                   ELSE
        !           129:                      GO TO 50
        !           130:                   END IF
        !           131:    40          CONTINUE
        !           132:    50       CONTINUE
        !           133: *
        !           134:          END IF
        !           135: *
        !           136:       ELSE IF( ENDD-START.GT.SELECT ) THEN
        !           137: *
        !           138: *        Partition D( START:ENDD ) and stack parts, largest one first
        !           139: *
        !           140: *        Choose partition entry as median of 3
        !           141: *
        !           142:          D1 = D( START )
        !           143:          D2 = D( ENDD )
        !           144:          I = ( START+ENDD ) / 2
        !           145:          D3 = D( I )
        !           146:          IF( D1.LT.D2 ) THEN
        !           147:             IF( D3.LT.D1 ) THEN
        !           148:                DMNMX = D1
        !           149:             ELSE IF( D3.LT.D2 ) THEN
        !           150:                DMNMX = D3
        !           151:             ELSE
        !           152:                DMNMX = D2
        !           153:             END IF
        !           154:          ELSE
        !           155:             IF( D3.LT.D2 ) THEN
        !           156:                DMNMX = D2
        !           157:             ELSE IF( D3.LT.D1 ) THEN
        !           158:                DMNMX = D3
        !           159:             ELSE
        !           160:                DMNMX = D1
        !           161:             END IF
        !           162:          END IF
        !           163: *
        !           164:          IF( DIR.EQ.0 ) THEN
        !           165: *
        !           166: *           Sort into decreasing order
        !           167: *
        !           168:             I = START - 1
        !           169:             J = ENDD + 1
        !           170:    60       CONTINUE
        !           171:    70       CONTINUE
        !           172:             J = J - 1
        !           173:             IF( D( J ).LT.DMNMX )
        !           174:      $         GO TO 70
        !           175:    80       CONTINUE
        !           176:             I = I + 1
        !           177:             IF( D( I ).GT.DMNMX )
        !           178:      $         GO TO 80
        !           179:             IF( I.LT.J ) THEN
        !           180:                TMP = D( I )
        !           181:                D( I ) = D( J )
        !           182:                D( J ) = TMP
        !           183:                GO TO 60
        !           184:             END IF
        !           185:             IF( J-START.GT.ENDD-J-1 ) THEN
        !           186:                STKPNT = STKPNT + 1
        !           187:                STACK( 1, STKPNT ) = START
        !           188:                STACK( 2, STKPNT ) = J
        !           189:                STKPNT = STKPNT + 1
        !           190:                STACK( 1, STKPNT ) = J + 1
        !           191:                STACK( 2, STKPNT ) = ENDD
        !           192:             ELSE
        !           193:                STKPNT = STKPNT + 1
        !           194:                STACK( 1, STKPNT ) = J + 1
        !           195:                STACK( 2, STKPNT ) = ENDD
        !           196:                STKPNT = STKPNT + 1
        !           197:                STACK( 1, STKPNT ) = START
        !           198:                STACK( 2, STKPNT ) = J
        !           199:             END IF
        !           200:          ELSE
        !           201: *
        !           202: *           Sort into increasing order
        !           203: *
        !           204:             I = START - 1
        !           205:             J = ENDD + 1
        !           206:    90       CONTINUE
        !           207:   100       CONTINUE
        !           208:             J = J - 1
        !           209:             IF( D( J ).GT.DMNMX )
        !           210:      $         GO TO 100
        !           211:   110       CONTINUE
        !           212:             I = I + 1
        !           213:             IF( D( I ).LT.DMNMX )
        !           214:      $         GO TO 110
        !           215:             IF( I.LT.J ) THEN
        !           216:                TMP = D( I )
        !           217:                D( I ) = D( J )
        !           218:                D( J ) = TMP
        !           219:                GO TO 90
        !           220:             END IF
        !           221:             IF( J-START.GT.ENDD-J-1 ) THEN
        !           222:                STKPNT = STKPNT + 1
        !           223:                STACK( 1, STKPNT ) = START
        !           224:                STACK( 2, STKPNT ) = J
        !           225:                STKPNT = STKPNT + 1
        !           226:                STACK( 1, STKPNT ) = J + 1
        !           227:                STACK( 2, STKPNT ) = ENDD
        !           228:             ELSE
        !           229:                STKPNT = STKPNT + 1
        !           230:                STACK( 1, STKPNT ) = J + 1
        !           231:                STACK( 2, STKPNT ) = ENDD
        !           232:                STKPNT = STKPNT + 1
        !           233:                STACK( 1, STKPNT ) = START
        !           234:                STACK( 2, STKPNT ) = J
        !           235:             END IF
        !           236:          END IF
        !           237:       END IF
        !           238:       IF( STKPNT.GT.0 )
        !           239:      $   GO TO 10
        !           240:       RETURN
        !           241: *
        !           242: *     End of DLASRT
        !           243: *
        !           244:       END

CVSweb interface <joel.bertrand@systella.fr>