4
5
6
7
8
9
10
11 CHARACTER ID
12 INTEGER INFO, N
13
14
15 INTEGER KEY( * )
16 DOUBLE PRECISION D( * )
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 INTEGER SELECT
60 parameter( SELECT = 20 )
61
62
63 INTEGER DIR, ENDD, I, J, START, STKPNT, TMPKEY
64 DOUBLE PRECISION D1, D2, D3, DMNMX, TMP
65
66
67 INTEGER STACK( 2, 32 )
68
69
70 LOGICAL LSAME
72
73
74 EXTERNAL xerbla
75
76
77
78
79
80
81 info = 0
82 dir = -1
83 IF(
lsame( id,
'D' ) )
THEN
84 dir = 0
85 ELSE IF(
lsame( id,
'I' ) )
THEN
86 dir = 1
87 END IF
88 IF( dir.EQ.-1 ) THEN
89 info = -1
90 ELSE IF( n.LT.0 ) THEN
91 info = -2
92 END IF
93 IF( info.NE.0 ) THEN
94 CALL xerbla( 'DLASRT2', -info )
95 RETURN
96 END IF
97
98
99
100 IF( n.LE.1 )
101 $ RETURN
102
103 stkpnt = 1
104 stack( 1, 1 ) = 1
105 stack( 2, 1 ) = n
106 10 CONTINUE
107 start = stack( 1, stkpnt )
108 endd = stack( 2, stkpnt )
109 stkpnt = stkpnt - 1
110 IF( endd-start.GT.0 ) THEN
111
112
113
114 IF( dir.EQ.0 ) THEN
115
116
117
118 DO 30 i = start + 1, endd
119 DO 20 j = i, start + 1, -1
120 IF( d( j ).GT.d( j-1 ) ) THEN
121 dmnmx = d( j )
122 d( j ) = d( j-1 )
123 d( j-1 ) = dmnmx
124 tmpkey = key( j )
125 key( j ) = key( j-1 )
126 key( j-1 ) = tmpkey
127 ELSE
128 GO TO 30
129 END IF
130 20 CONTINUE
131 30 CONTINUE
132
133 ELSE
134
135
136
137 DO 50 i = start + 1, endd
138 DO 40 j = i, start + 1, -1
139 IF( d( j ).LT.d( j-1 ) ) THEN
140 dmnmx = d( j )
141 d( j ) = d( j-1 )
142 d( j-1 ) = dmnmx
143 tmpkey = key( j )
144 key( j ) = key( j-1 )
145 key( j-1 ) = tmpkey
146 ELSE
147 GO TO 50
148 END IF
149 40 CONTINUE
150 50 CONTINUE
151
152 END IF
153
154 ELSE IF( endd-start.GT.SELECT ) THEN
155
156
157
158
159
160 d1 = d( start )
161 d2 = d( endd )
162 i = ( start+endd ) / 2
163 d3 = d( i )
164 IF( d1.LT.d2 ) THEN
165 IF( d3.LT.d1 ) THEN
166 dmnmx = d1
167 ELSE IF( d3.LT.d2 ) THEN
168 dmnmx = d3
169 ELSE
170 dmnmx = d2
171 END IF
172 ELSE
173 IF( d3.LT.d2 ) THEN
174 dmnmx = d2
175 ELSE IF( d3.LT.d1 ) THEN
176 dmnmx = d3
177 ELSE
178 dmnmx = d1
179 END IF
180 END IF
181
182 IF( dir.EQ.0 ) THEN
183
184
185
186 i = start - 1
187 j = endd + 1
188 60 CONTINUE
189 70 CONTINUE
190 j = j - 1
191 IF( d( j ).LT.dmnmx )
192 $ GO TO 70
193 80 CONTINUE
194 i = i + 1
195 IF( d( i ).GT.dmnmx )
196 $ GO TO 80
197 IF( i.LT.j ) THEN
198 tmp = d( i )
199 d( i ) = d( j )
200 d( j ) = tmp
201 tmpkey = key( j )
202 key( j ) = key( i )
203 key( i ) = tmpkey
204 GO TO 60
205 END IF
206 IF( j-start.GT.endd-j-1 ) THEN
207 stkpnt = stkpnt + 1
208 stack( 1, stkpnt ) = start
209 stack( 2, stkpnt ) = j
210 stkpnt = stkpnt + 1
211 stack( 1, stkpnt ) = j + 1
212 stack( 2, stkpnt ) = endd
213 ELSE
214 stkpnt = stkpnt + 1
215 stack( 1, stkpnt ) = j + 1
216 stack( 2, stkpnt ) = endd
217 stkpnt = stkpnt + 1
218 stack( 1, stkpnt ) = start
219 stack( 2, stkpnt ) = j
220 END IF
221 ELSE
222
223
224
225 i = start - 1
226 j = endd + 1
227 90 CONTINUE
228 100 CONTINUE
229 j = j - 1
230 IF( d( j ).GT.dmnmx )
231 $ GO TO 100
232 110 CONTINUE
233 i = i + 1
234 IF( d( i ).LT.dmnmx )
235 $ GO TO 110
236 IF( i.LT.j ) THEN
237 tmp = d( i )
238 d( i ) = d( j )
239 d( j ) = tmp
240 tmpkey = key( j )
241 key( j ) = key( i )
242 key( i ) = tmpkey
243 GO TO 90
244 END IF
245 IF( j-start.GT.endd-j-1 ) THEN
246 stkpnt = stkpnt + 1
247 stack( 1, stkpnt ) = start
248 stack( 2, stkpnt ) = j
249 stkpnt = stkpnt + 1
250 stack( 1, stkpnt ) = j + 1
251 stack( 2, stkpnt ) = endd
252 ELSE
253 stkpnt = stkpnt + 1
254 stack( 1, stkpnt ) = j + 1
255 stack( 2, stkpnt ) = endd
256 stkpnt = stkpnt + 1
257 stack( 1, stkpnt ) = start
258 stack( 2, stkpnt ) = j
259 END IF
260 END IF
261 END IF
262 IF( stkpnt.GT.0 )
263 $ GO TO 10
264
265
266 RETURN
267
268
269