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>