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