github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/internal/testdata/dsterftest/dlasrt.f (about) 1 *> \brief \b DLASRT sorts numbers in increasing or decreasing order. 2 * 3 * =========== DOCUMENTATION =========== 4 * 5 * Online html documentation available at 6 * http://www.netlib.org/lapack/explore-html/ 7 * 8 *> \htmlonly 9 *> Download DLASRT + dependencies 10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasrt.f"> 11 *> [TGZ]</a> 12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasrt.f"> 13 *> [ZIP]</a> 14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasrt.f"> 15 *> [TXT]</a> 16 *> \endhtmlonly 17 * 18 * Definition: 19 * =========== 20 * 21 * SUBROUTINE DLASRT( ID, N, D, INFO ) 22 * 23 * .. Scalar Arguments .. 24 * CHARACTER ID 25 * INTEGER INFO, N 26 * .. 27 * .. Array Arguments .. 28 * DOUBLE PRECISION D( * ) 29 * .. 30 * 31 * 32 *> \par Purpose: 33 * ============= 34 *> 35 *> \verbatim 36 *> 37 *> Sort the numbers in D in increasing order (if ID = 'I') or 38 *> in decreasing order (if ID = 'D' ). 39 *> 40 *> Use Quick Sort, reverting to Insertion sort on arrays of 41 *> size <= 20. Dimension of STACK limits N to about 2**32. 42 *> \endverbatim 43 * 44 * Arguments: 45 * ========== 46 * 47 *> \param[in] ID 48 *> \verbatim 49 *> ID is CHARACTER*1 50 *> = 'I': sort D in increasing order; 51 *> = 'D': sort D in decreasing order. 52 *> \endverbatim 53 *> 54 *> \param[in] N 55 *> \verbatim 56 *> N is INTEGER 57 *> The length of the array D. 58 *> \endverbatim 59 *> 60 *> \param[in,out] D 61 *> \verbatim 62 *> D is DOUBLE PRECISION array, dimension (N) 63 *> On entry, the array to be sorted. 64 *> On exit, D has been sorted into increasing order 65 *> (D(1) <= ... <= D(N) ) or into decreasing order 66 *> (D(1) >= ... >= D(N) ), depending on ID. 67 *> \endverbatim 68 *> 69 *> \param[out] INFO 70 *> \verbatim 71 *> INFO is INTEGER 72 *> = 0: successful exit 73 *> < 0: if INFO = -i, the i-th argument had an illegal value 74 *> \endverbatim 75 * 76 * Authors: 77 * ======== 78 * 79 *> \author Univ. of Tennessee 80 *> \author Univ. of California Berkeley 81 *> \author Univ. of Colorado Denver 82 *> \author NAG Ltd. 83 * 84 *> \date September 2012 85 * 86 *> \ingroup auxOTHERcomputational 87 * 88 * ===================================================================== 89 SUBROUTINE DLASRT( ID, N, D, INFO ) 90 * 91 * -- LAPACK computational routine (version 3.4.2) -- 92 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 93 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 94 * September 2012 95 * 96 * .. Scalar Arguments .. 97 CHARACTER ID 98 INTEGER INFO, N 99 * .. 100 * .. Array Arguments .. 101 DOUBLE PRECISION D( * ) 102 * .. 103 * 104 * ===================================================================== 105 * 106 * .. Parameters .. 107 INTEGER SELECT 108 PARAMETER ( SELECT = 20 ) 109 * .. 110 * .. Local Scalars .. 111 INTEGER DIR, ENDD, I, J, START, STKPNT 112 DOUBLE PRECISION D1, D2, D3, DMNMX, TMP 113 * .. 114 * .. Local Arrays .. 115 INTEGER STACK( 2, 32 ) 116 * .. 117 * .. External Functions .. 118 LOGICAL LSAME 119 EXTERNAL LSAME 120 * .. 121 * .. External Subroutines .. 122 EXTERNAL XERBLA 123 * .. 124 * .. Executable Statements .. 125 * 126 * Test the input paramters. 127 * 128 INFO = 0 129 DIR = -1 130 IF( LSAME( ID, 'D' ) ) THEN 131 DIR = 0 132 ELSE IF( LSAME( ID, 'I' ) ) THEN 133 DIR = 1 134 END IF 135 IF( DIR.EQ.-1 ) THEN 136 INFO = -1 137 ELSE IF( N.LT.0 ) THEN 138 INFO = -2 139 END IF 140 IF( INFO.NE.0 ) THEN 141 CALL XERBLA( 'DLASRT', -INFO ) 142 RETURN 143 END IF 144 * 145 * Quick return if possible 146 * 147 IF( N.LE.1 ) 148 $ RETURN 149 * 150 STKPNT = 1 151 STACK( 1, 1 ) = 1 152 STACK( 2, 1 ) = N 153 10 CONTINUE 154 START = STACK( 1, STKPNT ) 155 ENDD = STACK( 2, STKPNT ) 156 STKPNT = STKPNT - 1 157 IF( ENDD-START.LE.SELECT .AND. ENDD-START.GT.0 ) THEN 158 * 159 * Do Insertion sort on D( START:ENDD ) 160 * 161 IF( DIR.EQ.0 ) THEN 162 * 163 * Sort into decreasing order 164 * 165 DO 30 I = START + 1, ENDD 166 DO 20 J = I, START + 1, -1 167 IF( D( J ).GT.D( J-1 ) ) THEN 168 DMNMX = D( J ) 169 D( J ) = D( J-1 ) 170 D( J-1 ) = DMNMX 171 ELSE 172 GO TO 30 173 END IF 174 20 CONTINUE 175 30 CONTINUE 176 * 177 ELSE 178 * 179 * Sort into increasing order 180 * 181 DO 50 I = START + 1, ENDD 182 DO 40 J = I, START + 1, -1 183 IF( D( J ).LT.D( J-1 ) ) THEN 184 DMNMX = D( J ) 185 D( J ) = D( J-1 ) 186 D( J-1 ) = DMNMX 187 ELSE 188 GO TO 50 189 END IF 190 40 CONTINUE 191 50 CONTINUE 192 * 193 END IF 194 * 195 ELSE IF( ENDD-START.GT.SELECT ) THEN 196 * 197 * Partition D( START:ENDD ) and stack parts, largest one first 198 * 199 * Choose partition entry as median of 3 200 * 201 D1 = D( START ) 202 D2 = D( ENDD ) 203 I = ( START+ENDD ) / 2 204 D3 = D( I ) 205 IF( D1.LT.D2 ) THEN 206 IF( D3.LT.D1 ) THEN 207 DMNMX = D1 208 ELSE IF( D3.LT.D2 ) THEN 209 DMNMX = D3 210 ELSE 211 DMNMX = D2 212 END IF 213 ELSE 214 IF( D3.LT.D2 ) THEN 215 DMNMX = D2 216 ELSE IF( D3.LT.D1 ) THEN 217 DMNMX = D3 218 ELSE 219 DMNMX = D1 220 END IF 221 END IF 222 * 223 IF( DIR.EQ.0 ) THEN 224 * 225 * Sort into decreasing order 226 * 227 I = START - 1 228 J = ENDD + 1 229 60 CONTINUE 230 70 CONTINUE 231 J = J - 1 232 IF( D( J ).LT.DMNMX ) 233 $ GO TO 70 234 80 CONTINUE 235 I = I + 1 236 IF( D( I ).GT.DMNMX ) 237 $ GO TO 80 238 IF( I.LT.J ) THEN 239 TMP = D( I ) 240 D( I ) = D( J ) 241 D( J ) = TMP 242 GO TO 60 243 END IF 244 IF( J-START.GT.ENDD-J-1 ) THEN 245 STKPNT = STKPNT + 1 246 STACK( 1, STKPNT ) = START 247 STACK( 2, STKPNT ) = J 248 STKPNT = STKPNT + 1 249 STACK( 1, STKPNT ) = J + 1 250 STACK( 2, STKPNT ) = ENDD 251 ELSE 252 STKPNT = STKPNT + 1 253 STACK( 1, STKPNT ) = J + 1 254 STACK( 2, STKPNT ) = ENDD 255 STKPNT = STKPNT + 1 256 STACK( 1, STKPNT ) = START 257 STACK( 2, STKPNT ) = J 258 END IF 259 ELSE 260 * 261 * Sort into increasing order 262 * 263 I = START - 1 264 J = ENDD + 1 265 90 CONTINUE 266 100 CONTINUE 267 J = J - 1 268 IF( D( J ).GT.DMNMX ) 269 $ GO TO 100 270 110 CONTINUE 271 I = I + 1 272 IF( D( I ).LT.DMNMX ) 273 $ GO TO 110 274 IF( I.LT.J ) THEN 275 TMP = D( I ) 276 D( I ) = D( J ) 277 D( J ) = TMP 278 GO TO 90 279 END IF 280 IF( J-START.GT.ENDD-J-1 ) THEN 281 STKPNT = STKPNT + 1 282 STACK( 1, STKPNT ) = START 283 STACK( 2, STKPNT ) = J 284 STKPNT = STKPNT + 1 285 STACK( 1, STKPNT ) = J + 1 286 STACK( 2, STKPNT ) = ENDD 287 ELSE 288 STKPNT = STKPNT + 1 289 STACK( 1, STKPNT ) = J + 1 290 STACK( 2, STKPNT ) = ENDD 291 STKPNT = STKPNT + 1 292 STACK( 1, STKPNT ) = START 293 STACK( 2, STKPNT ) = J 294 END IF 295 END IF 296 END IF 297 IF( STKPNT.GT.0 ) 298 $ GO TO 10 299 RETURN 300 * 301 * End of DLASRT 302 * 303 END