File:  [local] / rpl / lapack / lapack / dlasrt.f
Revision 1.7: download - view: text, annotated - select for diffs - revision graph
Tue Dec 21 13:53:33 2010 UTC (13 years, 5 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_3, rpl-4_1_2, rpl-4_1_1, rpl-4_1_0, rpl-4_0_24, rpl-4_0_22, rpl-4_0_21, rpl-4_0_20, rpl-4_0, HEAD
Mise à jour de lapack vers la version 3.3.0.

    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>