163 integer(I4B),
dimension(:),
intent(inout) :: indx
164 real(DP),
dimension(:),
intent(inout) :: v
165 logical,
intent(in),
optional :: reverse
168 integer(I4B),
parameter :: nn = 15
169 integer(I4B),
parameter :: nstack = 50
170 integer(I4B) :: nsize
174 integer(I4B) :: jstack
175 integer(I4B) :: ileft
176 integer(I4B) :: iright
177 integer(I4B),
dimension(nstack) :: istack
185 if (
present(reverse))
then
199 if (iright - ileft < nn)
then
200 do j = (ileft + 1), iright
203 do i = (j - 1), ileft, -1
206 indx(i + 1) = indx(i)
211 if (jstack == 0)
return
212 iright = istack(jstack)
213 ileft = istack(jstack - 1)
216 k = (ileft + iright) / 2
217 call rswap(v(k), v(ileft + 1))
218 call iswap(indx(k), indx(ileft + 1))
219 if (v(ileft) > v(iright))
then
220 call rswap(v(ileft), v(iright))
221 call iswap(indx(ileft), indx(iright))
223 if (v(ileft + 1) > v(iright))
then
224 call rswap(v(ileft + 1), v(iright))
225 call iswap(indx(ileft + 1), indx(iright))
227 if (v(ileft) > v(ileft + 1))
then
228 call rswap(v(ileft), v(ileft + 1))
229 call iswap(indx(ileft), indx(ileft + 1))
251 call rswap(v(i), v(j))
252 call iswap(indx(i), indx(j))
255 indx(ileft + 1) = indx(j)
259 if (jstack > nstack)
then
260 write (errmsg,
'(a,3(1x,a))') &
261 'JSTACK > NSTACK IN SortModule::qsort'
262 call store_error(errmsg, terminate=.true.)
264 if ((iright - i + 1) >= (j - 1))
then
265 istack(jstack) = iright
266 istack(jstack - 1) = i
269 istack(jstack) = j - 1
270 istack(jstack - 1) = ileft
280 call rswap(v(i), v(j))
281 call iswap(indx(i), indx(j))