51
52
53
54
55
56
57
58
59
60#include "implicit_f.inc"
61
62
63
64
65 INTEGER N,ERROR,PERM(N)
66
68 . a(n)
69
70
71
72 INTEGER :: STACKLEN
73 INTEGER :: TRESHOLD
74 INTEGER :: DONE
75
76 parameter( stacklen = 128 ,
77 . treshold = 9 )
78
79 INTEGER :: I
80 INTEGER :: IPLUS1
81 INTEGER :: J
82 INTEGER :: JMINUS1
83 INTEGER :: K
84 INTEGER :: LEFT
85 INTEGER :: LLEN
86 INTEGER :: RIGHT
87 INTEGER :: RLEN
88 INTEGER :: TOP
89 INTEGER :: STACK(STACKLEN)
90
92 . rk, rv
93
94 error = 0
95
96 IF (n < 1) THEN
97 error = -1
98 RETURN
99 ENDIF
100
101 IF (n == 1) THEN
102 perm(1)=1
103 RETURN
104 ENDIF
105
106 DO i = 1, n
107 perm(i) = i
108 ENDDO
109
110 top = 1
111 left = 1
112 right = n
113 IF (n <= treshold) THEN
114 done = 1
115 ELSE
116 done = 0
117 ENDIF
118
119
120
121 DO WHILE (done /= 1)
122 rk = a((left+right)/2)
123 a((left+right)/2) = a(left)
124 a(left) = rk
125
126 k = perm((left+right)/2)
127 perm((left+right)/2) = perm(left)
128 perm(left) = k
129
130 IF( a(left+1) > a(right) ) THEN
131 rk = a(left+1)
132 a(left+1) = a(right)
133 a(right) = rk
134 k = perm(left+1)
135 perm(left+1) = perm(right)
136 perm(right) = k
137 ENDIF
138 IF( a(left) > a(right) ) THEN
139 rk = a(left)
140 a(left) = a(right)
141 a(right) = rk
142 k = perm(left)
143 perm(left) = perm(right)
144 perm(right) = k
145 ENDIF
146 IF( a(left+1) > a(left) ) THEN
147 rk = a(left+1)
148 a(left+1) = a(left)
149 a(left) = rk
150 k = perm(left+1)
151 perm(left+1) = perm(left)
152 perm(left) = k
153 ENDIF
154
155 rv = a(left)
156 i = left+1
157 j = right
158
159 DO WHILE(j >= i)
160 i = i + 1
161 DO WHILE(a(i) < rv)
162 i = i +1
163 ENDDO
164 j = j - 1
165 DO WHILE(a(j) > rv)
166 j = j - 1
167 ENDDO
168 IF (j >= i) THEN
169 rk = a(i)
170 a(i) = a(j)
171 a(j) = rk
172 k = perm(i)
173 perm(i) = perm(j)
174 perm(j) = k
175 ENDIF
176 ENDDO
177
178 rk = a(left)
179 a(left) = a(j)
180 a(j) = rk
181
182 k = perm(left)
183 perm(left) = perm(j)
184 perm(j) = k
185
186 llen = j-left
187 rlen = right - i + 1
188
189 IF(
max(llen, rlen) <= treshold )
THEN
190 IF (top == 1) THEN
191 done = 1
192 ELSE
193 top = top - 2
194 left = stack(top)
195 right = stack(top+1)
196 ENDIF
197 ELSE IF(
min(llen, rlen) <= treshold)
THEN
198 IF( llen > rlen ) THEN
199 right = j - 1
200 ELSE
201 left = i
202 ENDIF
203 ELSE
204 IF( llen > rlen ) THEN
205 stack(top) = left
206 stack(top+1) = j-1
207 left = i
208 ELSE
209 stack(top) = i
210 stack(top+1) = right
211 right = j-1
212 ENDIF
213 top = top + 2
214 ENDIF
215 END DO
216
217
218
219 i = n - 1
220 iplus1 = n
221 DO WHILE (i > 0)
222 IF( a(i) > a(iplus1) ) THEN
223 rk = a(i)
224 k = perm(i)
225 j = iplus1
226 jminus1 = i
227 DO WHILE(a(j) < rk)
228 a(jminus1) = a(j)
229 perm(jminus1) = perm(j)
230 jminus1 = j
231 j = j + 1
232 IF ( j > n ) EXIT
233 ENDDO
234 a(jminus1) = rk
235 perm(jminus1) = k
236 ENDIF
237
238 iplus1 = i
239 i = i - 1
240 ENDDO
241
242 RETURN
243
244
245