OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
myqsort_int.F File Reference
#include "implicit_f.inc"

Go to the source code of this file.

Functions/Subroutines

subroutine myqsort_int (n, a, perm, error)

Function/Subroutine Documentation

◆ myqsort_int()

subroutine myqsort_int ( integer n,
integer, dimension(n) a,
integer, dimension(n) perm,
integer error )

Definition at line 35 of file myqsort_int.F.

36C-----------------------------------------------
37c q u i c k s o r t
38C Sedgewick algorithm from "Implementing Quicksort Programs" ; int version
39C A: data
40C N: len
41C PERM: permutations
42C-----------------------------------------------
43C I m p l i c i t T y p e s
44C-----------------------------------------------
45#include "implicit_f.inc"
46C-----------------------------------------------
47C-----------------------------------------------
48C D u m m y A r g u m e n t s
49C-----------------------------------------------
50 INTEGER N,ERROR,PERM(N)
51 INTEGER :: A(N)
52C-----------------------------------------------
53C L o c a l V a r i a b l e s
54C-----------------------------------------------
55 INTEGER :: STACKLEN
56 INTEGER :: TRESHOLD
57 INTEGER :: DONE
58C the max STACKLEN <= 1 + 2 x log2 (N+1)/(TRESHOLD + 2)
59 parameter( stacklen = 128 ,
60 . treshold = 9 )
61C
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)
73C REAL ou REAL*8
75 . rk, rv
76C
77 error = 0
78C
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
92C
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
102c QUICKSORT
103c
104 DO WHILE (done /= 1)
105 rk = a((left+right)/2)
106 a((left+right)/2) = a(left)
107 a(left) = rk
108C
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
160C
161 rk = a(left)
162 a(left) = a(j)
163 a(j) = rk
164C
165 k = perm(left)
166 perm(left) = perm(j)
167 perm(j) = k
168C
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
199c
200c INSERTION SORT
201c
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
220C
221 iplus1 = i
222 i = i - 1
223 ENDDO
224c
225 RETURN
226c
227c -------------------
228c
#define my_real
Definition cppsort.cpp:32
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21