Statistiques
| Révision :

root / src / refsor.f90 @ 2

Historique | Voir | Annoter | Télécharger (13,71 ko)

1 1 equemene
!!! Downloaded from http://www.fortran-2000.com/rank/index.html
2 1 equemene
!!! on October 13th, 2010
3 1 equemene
4 1 equemene
!PFL 2010 Oct 13->
5 1 equemene
! I deleted the 'module' part to keep only
6 1 equemene
! the Double subroutine.
7 1 equemene
8 1 equemene
! Module m_refsor
9 1 equemene
! ! PFL 2010 Oct 13 ->
10 1 equemene
! !Integer, Parameter :: kdp = selected_real_kind(15)
11 1 equemene
! Integer, Parameter :: kdp = KIND(1.0D0)
12 1 equemene
! ! <- PFL 2010 Oct 13
13 1 equemene
! public :: refsor
14 1 equemene
! private :: kdp
15 1 equemene
! private :: R_refsor, I_refsor, D_refsor
16 1 equemene
! private :: R_inssor, I_inssor, D_inssor
17 1 equemene
! private :: R_subsor, I_subsor, D_subsor
18 1 equemene
! interface refsor
19 1 equemene
!   module procedure d_refsor, r_refsor, i_refsor
20 1 equemene
! end interface refsor
21 1 equemene
! contains
22 1 equemene
23 1 equemene
! Subroutine D_refsor (XDONT)
24 1 equemene
 Subroutine Drefsor (XDONT)
25 1 equemene
!  Sorts XDONT into ascending order - Quicksort
26 1 equemene
! __________________________________________________________
27 1 equemene
!  Quicksort chooses a "pivot" in the set, and explores the
28 1 equemene
!  array from both ends, looking for a value > pivot with the
29 1 equemene
!  increasing index, for a value <= pivot with the decreasing
30 1 equemene
!  index, and swapping them when it has found one of each.
31 1 equemene
!  The array is then subdivided in 2 ([3]) subsets:
32 1 equemene
!  { values <= pivot} {pivot} {values > pivot}
33 1 equemene
!  One then call recursively the program to sort each subset.
34 1 equemene
!  When the size of the subarray is small enough, one uses an
35 1 equemene
!  insertion sort that is faster for very small sets.
36 1 equemene
!  Michel Olagnon - Apr. 2000
37 1 equemene
! __________________________________________________________
38 1 equemene
! __________________________________________________________
39 1 equemene
40 1 equemene
   use VarTypes
41 1 equemene
42 1 equemene
      Real (KREAL), Dimension (:), Intent (InOut) :: XDONT
43 1 equemene
! __________________________________________________________
44 1 equemene
!
45 1 equemene
!
46 1 equemene
      Call D_subsor (XDONT, 1, Size (XDONT))
47 1 equemene
      Call D_inssor (XDONT)
48 1 equemene
      Return
49 1 equemene
    End Subroutine Drefsor
50 1 equemene
51 1 equemene
Recursive Subroutine D_subsor (XDONT, IDEB1, IFIN1)
52 1 equemene
!  Sorts XDONT from IDEB1 to IFIN1
53 1 equemene
! __________________________________________________________
54 1 equemene
55 1 equemene
  use VarTypes
56 1 equemene
57 1 equemene
  IMPLICIT NONE
58 1 equemene
59 1 equemene
      Real(KREAL), dimension (:), Intent (InOut) :: XDONT
60 1 equemene
      Integer(KINT), Intent (In) :: IDEB1, IFIN1
61 1 equemene
! __________________________________________________________
62 1 equemene
      Integer(KINT), Parameter :: NINS = 16 ! Max for insertion sort
63 1 equemene
      Integer(KINT) :: ICRS, IDEB, IDCR, IFIN, IMIL
64 1 equemene
      Real(KREAL) :: XPIV, XWRK
65 1 equemene
!
66 1 equemene
      IDEB = IDEB1
67 1 equemene
      IFIN = IFIN1
68 1 equemene
!
69 1 equemene
!  If we don't have enough values to make it worth while, we leave
70 1 equemene
!  them unsorted, and the final insertion sort will take care of them
71 1 equemene
!
72 1 equemene
      If ((IFIN - IDEB) > NINS) Then
73 1 equemene
         IMIL = (IDEB+IFIN) / 2
74 1 equemene
!
75 1 equemene
!  One chooses a pivot, median of 1st, last, and middle values
76 1 equemene
!
77 1 equemene
         If (XDONT(IMIL) < XDONT(IDEB)) Then
78 1 equemene
            XWRK = XDONT (IDEB)
79 1 equemene
            XDONT (IDEB) = XDONT (IMIL)
80 1 equemene
            XDONT (IMIL) = XWRK
81 1 equemene
         End If
82 1 equemene
         If (XDONT(IMIL) > XDONT(IFIN)) Then
83 1 equemene
            XWRK = XDONT (IFIN)
84 1 equemene
            XDONT (IFIN) = XDONT (IMIL)
85 1 equemene
            XDONT (IMIL) = XWRK
86 1 equemene
            If (XDONT(IMIL) < XDONT(IDEB)) Then
87 1 equemene
               XWRK = XDONT (IDEB)
88 1 equemene
               XDONT (IDEB) = XDONT (IMIL)
89 1 equemene
               XDONT (IMIL) = XWRK
90 1 equemene
            End If
91 1 equemene
         End If
92 1 equemene
         XPIV = XDONT (IMIL)
93 1 equemene
!
94 1 equemene
!  One exchanges values to put those > pivot in the end and
95 1 equemene
!  those <= pivot at the beginning
96 1 equemene
!
97 1 equemene
         ICRS = IDEB
98 1 equemene
         IDCR = IFIN
99 1 equemene
         ECH2: Do
100 1 equemene
            Do
101 1 equemene
               ICRS = ICRS + 1
102 1 equemene
               If (ICRS >= IDCR) Then
103 1 equemene
!
104 1 equemene
!  the first  >  pivot is IDCR
105 1 equemene
!  the last   <= pivot is ICRS-1
106 1 equemene
!  Note: If one arrives here on the first iteration, then
107 1 equemene
!        the pivot is the maximum of the set, the last value is equal
108 1 equemene
!        to it, and one can reduce by one the size of the set to process,
109 1 equemene
!        as if XDONT (IFIN) > XPIV
110 1 equemene
!
111 1 equemene
                  Exit ECH2
112 1 equemene
!
113 1 equemene
               End If
114 1 equemene
               If (XDONT(ICRS) > XPIV) Exit
115 1 equemene
            End Do
116 1 equemene
            Do
117 1 equemene
               If (XDONT(IDCR) <= XPIV) Exit
118 1 equemene
               IDCR = IDCR - 1
119 1 equemene
               If (ICRS >= IDCR) Then
120 1 equemene
!
121 1 equemene
!  The last value < pivot is always ICRS-1
122 1 equemene
!
123 1 equemene
                  Exit ECH2
124 1 equemene
               End If
125 1 equemene
            End Do
126 1 equemene
!
127 1 equemene
            XWRK = XDONT (IDCR)
128 1 equemene
            XDONT (IDCR) = XDONT (ICRS)
129 1 equemene
            XDONT (ICRS) = XWRK
130 1 equemene
         End Do ECH2
131 1 equemene
!
132 1 equemene
!  One now sorts each of the two sub-intervals
133 1 equemene
!
134 1 equemene
         Call D_subsor (XDONT, IDEB1, ICRS-1)
135 1 equemene
         Call D_subsor (XDONT, IDCR, IFIN1)
136 1 equemene
      End If
137 1 equemene
      Return
138 1 equemene
    End Subroutine D_subsor
139 1 equemene
140 1 equemene
   Subroutine D_inssor (XDONT)
141 1 equemene
!  Sorts XDONT into increasing order (Insertion sort)
142 1 equemene
! __________________________________________________________
143 1 equemene
144 1 equemene
  use VarTypes
145 1 equemene
146 1 equemene
  IMPLICIT NONE
147 1 equemene
      Real(KREAL), dimension (:), Intent (InOut) :: XDONT
148 1 equemene
! __________________________________________________________
149 1 equemene
      Integer(KINT) :: ICRS, IDCR
150 1 equemene
      Real(KREAL) :: XWRK
151 1 equemene
!
152 1 equemene
      Do ICRS = 2, Size (XDONT)
153 1 equemene
         XWRK = XDONT (ICRS)
154 1 equemene
         If (XWRK >= XDONT(ICRS-1)) Cycle
155 1 equemene
         XDONT (ICRS) = XDONT (ICRS-1)
156 1 equemene
         Do IDCR = ICRS - 2, 1, - 1
157 1 equemene
            If (XWRK >= XDONT(IDCR)) Exit
158 1 equemene
            XDONT (IDCR+1) = XDONT (IDCR)
159 1 equemene
         End Do
160 1 equemene
         XDONT (IDCR+1) = XWRK
161 1 equemene
      End Do
162 1 equemene
!
163 1 equemene
      Return
164 1 equemene
!
165 1 equemene
End Subroutine D_inssor
166 1 equemene
167 1 equemene
168 1 equemene
! !
169 1 equemene
! Subroutine R_refsor (XDONT)
170 1 equemene
! !  Sorts XDONT into ascending order - Quicksort
171 1 equemene
! ! __________________________________________________________
172 1 equemene
! !  Quicksort chooses a "pivot" in the set, and explores the
173 1 equemene
! !  array from both ends, looking for a value > pivot with the
174 1 equemene
! !  increasing index, for a value <= pivot with the decreasing
175 1 equemene
! !  index, and swapping them when it has found one of each.
176 1 equemene
! !  The array is then subdivided in 2 ([3]) subsets:
177 1 equemene
! !  { values <= pivot} {pivot} {values > pivot}
178 1 equemene
! !  One then call recursively the program to sort each subset.
179 1 equemene
! !  When the size of the subarray is small enough, one uses an
180 1 equemene
! !  insertion sort that is faster for very small sets.
181 1 equemene
! !  Michel Olagnon - Apr. 2000
182 1 equemene
! ! __________________________________________________________
183 1 equemene
! ! _________________________________________________________
184 1 equemene
!       Real, Dimension (:), Intent (InOut) :: XDONT
185 1 equemene
! ! __________________________________________________________
186 1 equemene
! !
187 1 equemene
! !
188 1 equemene
!       Call R_subsor (XDONT, 1, Size (XDONT))
189 1 equemene
!       Call R_inssor (XDONT)
190 1 equemene
!       Return
191 1 equemene
! End Subroutine R_refsor
192 1 equemene
193 1 equemene
! Recursive Subroutine R_subsor (XDONT, IDEB1, IFIN1)
194 1 equemene
! !  Sorts XDONT from IDEB1 to IFIN1
195 1 equemene
! ! __________________________________________________________
196 1 equemene
!       Real, dimension (:), Intent (InOut) :: XDONT
197 1 equemene
!       Integer, Intent (In) :: IDEB1, IFIN1
198 1 equemene
! ! __________________________________________________________
199 1 equemene
!       Integer, Parameter :: NINS = 16 ! Max for insertion sort
200 1 equemene
!       Integer :: ICRS, IDEB, IDCR, IFIN, IMIL
201 1 equemene
!       Real :: XPIV, XWRK
202 1 equemene
! !
203 1 equemene
!       IDEB = IDEB1
204 1 equemene
!       IFIN = IFIN1
205 1 equemene
! !
206 1 equemene
! !  If we don't have enough values to make it worth while, we leave
207 1 equemene
! !  them unsorted, and the final insertion sort will take care of them
208 1 equemene
! !
209 1 equemene
!       If ((IFIN - IDEB) > NINS) Then
210 1 equemene
!          IMIL = (IDEB+IFIN) / 2
211 1 equemene
! !
212 1 equemene
! !  One chooses a pivot, median of 1st, last, and middle values
213 1 equemene
! !
214 1 equemene
!          If (XDONT(IMIL) < XDONT(IDEB)) Then
215 1 equemene
!             XWRK = XDONT (IDEB)
216 1 equemene
!             XDONT (IDEB) = XDONT (IMIL)
217 1 equemene
!             XDONT (IMIL) = XWRK
218 1 equemene
!          End If
219 1 equemene
!          If (XDONT(IMIL) > XDONT(IFIN)) Then
220 1 equemene
!             XWRK = XDONT (IFIN)
221 1 equemene
!             XDONT (IFIN) = XDONT (IMIL)
222 1 equemene
!             XDONT (IMIL) = XWRK
223 1 equemene
!             If (XDONT(IMIL) < XDONT(IDEB)) Then
224 1 equemene
!                XWRK = XDONT (IDEB)
225 1 equemene
!                XDONT (IDEB) = XDONT (IMIL)
226 1 equemene
!                XDONT (IMIL) = XWRK
227 1 equemene
!             End If
228 1 equemene
!          End If
229 1 equemene
!          XPIV = XDONT (IMIL)
230 1 equemene
! !
231 1 equemene
! !  One exchanges values to put those > pivot in the end and
232 1 equemene
! !  those <= pivot at the beginning
233 1 equemene
! !
234 1 equemene
!          ICRS = IDEB
235 1 equemene
!          IDCR = IFIN
236 1 equemene
!          ECH2: Do
237 1 equemene
!             Do
238 1 equemene
!                ICRS = ICRS + 1
239 1 equemene
!                If (ICRS >= IDCR) Then
240 1 equemene
! !
241 1 equemene
! !  the first  >  pivot is IDCR
242 1 equemene
! !  the last   <= pivot is ICRS-1
243 1 equemene
! !  Note: If one arrives here on the first iteration, then
244 1 equemene
! !        the pivot is the maximum of the set, the last value is equal
245 1 equemene
! !        to it, and one can reduce by one the size of the set to process,
246 1 equemene
! !        as if XDONT (IFIN) > XPIV
247 1 equemene
! !
248 1 equemene
!                   Exit ECH2
249 1 equemene
! !
250 1 equemene
!                End If
251 1 equemene
!                If (XDONT(ICRS) > XPIV) Exit
252 1 equemene
!             End Do
253 1 equemene
!             Do
254 1 equemene
!                If (XDONT(IDCR) <= XPIV) Exit
255 1 equemene
!                IDCR = IDCR - 1
256 1 equemene
!                If (ICRS >= IDCR) Then
257 1 equemene
! !
258 1 equemene
! !  The last value < pivot is always ICRS-1
259 1 equemene
! !
260 1 equemene
!                   Exit ECH2
261 1 equemene
!                End If
262 1 equemene
!             End Do
263 1 equemene
! !
264 1 equemene
!             XWRK = XDONT (IDCR)
265 1 equemene
!             XDONT (IDCR) = XDONT (ICRS)
266 1 equemene
!             XDONT (ICRS) = XWRK
267 1 equemene
!          End Do ECH2
268 1 equemene
! !
269 1 equemene
! !  One now sorts each of the two sub-intervals
270 1 equemene
! !
271 1 equemene
!          Call R_subsor (XDONT, IDEB1, ICRS-1)
272 1 equemene
!          Call R_subsor (XDONT, IDCR, IFIN1)
273 1 equemene
!       End If
274 1 equemene
!       Return
275 1 equemene
!    End Subroutine R_subsor
276 1 equemene
!    Subroutine R_inssor (XDONT)
277 1 equemene
! !  Sorts XDONT into increasing order (Insertion sort)
278 1 equemene
! ! __________________________________________________________
279 1 equemene
!       Real, dimension (:), Intent (InOut) :: XDONT
280 1 equemene
! ! __________________________________________________________
281 1 equemene
!       Integer :: ICRS, IDCR
282 1 equemene
!       Real :: XWRK
283 1 equemene
! !
284 1 equemene
!       Do ICRS = 2, Size (XDONT)
285 1 equemene
!          XWRK = XDONT (ICRS)
286 1 equemene
!          If (XWRK >= XDONT(ICRS-1)) Cycle
287 1 equemene
!          XDONT (ICRS) = XDONT (ICRS-1)
288 1 equemene
!          Do IDCR = ICRS - 2, 1, - 1
289 1 equemene
!             If (XWRK >= XDONT(IDCR)) Exit
290 1 equemene
!             XDONT (IDCR+1) = XDONT (IDCR)
291 1 equemene
!          End Do
292 1 equemene
!          XDONT (IDCR+1) = XWRK
293 1 equemene
!       End Do
294 1 equemene
! !
295 1 equemene
!       Return
296 1 equemene
! !
297 1 equemene
! End Subroutine R_inssor
298 1 equemene
! !
299 1 equemene
! Subroutine I_refsor (XDONT)
300 1 equemene
! !  Sorts XDONT into ascending order - Quicksort
301 1 equemene
! ! __________________________________________________________
302 1 equemene
! !  Quicksort chooses a "pivot" in the set, and explores the
303 1 equemene
! !  array from both ends, looking for a value > pivot with the
304 1 equemene
! !  increasing index, for a value <= pivot with the decreasing
305 1 equemene
! !  index, and swapping them when it has found one of each.
306 1 equemene
! !  The array is then subdivided in 2 ([3]) subsets:
307 1 equemene
! !  { values <= pivot} {pivot} {values > pivot}
308 1 equemene
! !  One then call recursively the program to sort each subset.
309 1 equemene
! !  When the size of the subarray is small enough, one uses an
310 1 equemene
! !  insertion sort that is faster for very small sets.
311 1 equemene
! !  Michel Olagnon - Apr. 2000
312 1 equemene
! ! __________________________________________________________
313 1 equemene
! ! __________________________________________________________
314 1 equemene
!       Integer, Dimension (:), Intent (InOut)  :: XDONT
315 1 equemene
! ! __________________________________________________________
316 1 equemene
! !
317 1 equemene
! !
318 1 equemene
!       Call I_subsor (XDONT, 1, Size (XDONT))
319 1 equemene
!       Call I_inssor (XDONT)
320 1 equemene
!       Return
321 1 equemene
! End Subroutine I_refsor
322 1 equemene
! Recursive Subroutine I_subsor (XDONT, IDEB1, IFIN1)
323 1 equemene
! !  Sorts XDONT from IDEB1 to IFIN1
324 1 equemene
! ! __________________________________________________________
325 1 equemene
!       Integer, dimension (:), Intent (InOut) :: XDONT
326 1 equemene
!       Integer, Intent (In) :: IDEB1, IFIN1
327 1 equemene
! ! __________________________________________________________
328 1 equemene
!       Integer, Parameter :: NINS = 16 ! Max for insertion sort
329 1 equemene
!       Integer :: ICRS, IDEB, IDCR, IFIN, IMIL
330 1 equemene
!       Integer :: XPIV, XWRK
331 1 equemene
! !
332 1 equemene
!       IDEB = IDEB1
333 1 equemene
!       IFIN = IFIN1
334 1 equemene
! !
335 1 equemene
! !  If we don't have enough values to make it worth while, we leave
336 1 equemene
! !  them unsorted, and the final insertion sort will take care of them
337 1 equemene
! !
338 1 equemene
!       If ((IFIN - IDEB) > NINS) Then
339 1 equemene
!          IMIL = (IDEB+IFIN) / 2
340 1 equemene
! !
341 1 equemene
! !  One chooses a pivot, median of 1st, last, and middle values
342 1 equemene
! !
343 1 equemene
!          If (XDONT(IMIL) < XDONT(IDEB)) Then
344 1 equemene
!             XWRK = XDONT (IDEB)
345 1 equemene
!             XDONT (IDEB) = XDONT (IMIL)
346 1 equemene
!             XDONT (IMIL) = XWRK
347 1 equemene
!          End If
348 1 equemene
!          If (XDONT(IMIL) > XDONT(IFIN)) Then
349 1 equemene
!             XWRK = XDONT (IFIN)
350 1 equemene
!             XDONT (IFIN) = XDONT (IMIL)
351 1 equemene
!             XDONT (IMIL) = XWRK
352 1 equemene
!             If (XDONT(IMIL) < XDONT(IDEB)) Then
353 1 equemene
!                XWRK = XDONT (IDEB)
354 1 equemene
!                XDONT (IDEB) = XDONT (IMIL)
355 1 equemene
!                XDONT (IMIL) = XWRK
356 1 equemene
!             End If
357 1 equemene
!          End If
358 1 equemene
!          XPIV = XDONT (IMIL)
359 1 equemene
! !
360 1 equemene
! !  One exchanges values to put those > pivot in the end and
361 1 equemene
! !  those <= pivot at the beginning
362 1 equemene
! !
363 1 equemene
!          ICRS = IDEB
364 1 equemene
!          IDCR = IFIN
365 1 equemene
!          ECH2: Do
366 1 equemene
!             Do
367 1 equemene
!                ICRS = ICRS + 1
368 1 equemene
!                If (ICRS >= IDCR) Then
369 1 equemene
! !
370 1 equemene
! !  the first  >  pivot is IDCR
371 1 equemene
! !  the last   <= pivot is ICRS-1
372 1 equemene
! !  Note: If one arrives here on the first iteration, then
373 1 equemene
! !        the pivot is the maximum of the set, the last value is equal
374 1 equemene
! !        to it, and one can reduce by one the size of the set to process,
375 1 equemene
! !        as if XDONT (IFIN) > XPIV
376 1 equemene
! !
377 1 equemene
!                   Exit ECH2
378 1 equemene
! !
379 1 equemene
!                End If
380 1 equemene
!                If (XDONT(ICRS) > XPIV) Exit
381 1 equemene
!             End Do
382 1 equemene
!             Do
383 1 equemene
!                If (XDONT(IDCR) <= XPIV) Exit
384 1 equemene
!                IDCR = IDCR - 1
385 1 equemene
!                If (ICRS >= IDCR) Then
386 1 equemene
! !
387 1 equemene
! !  The last value < pivot is always ICRS-1
388 1 equemene
! !
389 1 equemene
!                   Exit ECH2
390 1 equemene
!                End If
391 1 equemene
!             End Do
392 1 equemene
! !
393 1 equemene
!             XWRK = XDONT (IDCR)
394 1 equemene
!             XDONT (IDCR) = XDONT (ICRS)
395 1 equemene
!             XDONT (ICRS) = XWRK
396 1 equemene
!          End Do ECH2
397 1 equemene
! !
398 1 equemene
! !  One now sorts each of the two sub-intervals
399 1 equemene
! !
400 1 equemene
!          Call I_subsor (XDONT, IDEB1, ICRS-1)
401 1 equemene
!          Call I_subsor (XDONT, IDCR, IFIN1)
402 1 equemene
!       End If
403 1 equemene
!       Return
404 1 equemene
!    End Subroutine I_subsor
405 1 equemene
!    Subroutine I_inssor (XDONT)
406 1 equemene
! !  Sorts XDONT into increasing order (Insertion sort)
407 1 equemene
! ! __________________________________________________________
408 1 equemene
!       Integer, dimension (:), Intent (InOut) :: XDONT
409 1 equemene
! ! __________________________________________________________
410 1 equemene
!       Integer :: ICRS, IDCR
411 1 equemene
!       Integer :: XWRK
412 1 equemene
! !
413 1 equemene
!       Do ICRS = 2, Size (XDONT)
414 1 equemene
!          XWRK = XDONT (ICRS)
415 1 equemene
!          If (XWRK >= XDONT(ICRS-1)) Cycle
416 1 equemene
!          XDONT (ICRS) = XDONT (ICRS-1)
417 1 equemene
!          Do IDCR = ICRS - 2, 1, - 1
418 1 equemene
!             If (XWRK >= XDONT(IDCR)) Exit
419 1 equemene
!             XDONT (IDCR+1) = XDONT (IDCR)
420 1 equemene
!          End Do
421 1 equemene
!          XDONT (IDCR+1) = XWRK
422 1 equemene
!       End Do
423 1 equemene
! !
424 1 equemene
!       Return
425 1 equemene
! !
426 1 equemene
! End Subroutine I_inssor
427 1 equemene
! !
428 1 equemene
! end module m_refsor