Changeset 3026 for branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src
- Timestamp:
- 2011-10-28T18:10:29+02:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dev_2802_OBStools/NEMOGCM/TOOLS/OBSTOOLS/src/index_sort.F90
r2945 r3026 279 279 END SUBROUTINE index_sort_int 280 280 281 SUBROUTINE index_sort_string(cdval, kindx, kvals) 282 USE toolspar_kind 283 IMPLICIT NONE 284 !!---------------------------------------------------------------------- 285 !! *** ROUTINE index_sort *** 286 !! 287 !! ** Purpose : Get indicies for ascending order for an 288 !! integer array 289 !! 290 !! ** Method : Heapsort 291 !! 292 !! ** Action : 293 !! 294 !! References : http://en.wikipedia.org/wiki/Heapsort 295 !! 296 !! History : 297 !! ! 06-05 (K. Mogensen) Original code 298 !!---------------------------------------------------------------------- 299 !! * Arguments 300 CHARACTER(len=*),DIMENSION(*),INTENT(IN) :: & 301 & cdval ! Array to be sorted 302 INTEGER,DIMENSION(*),INTENT(INOUT) :: & 303 & kindx ! Indicies for ordering 304 INTEGER, INTENT(IN) :: & 305 & kvals ! Number of values 306 307 !! * Local variables 308 INTEGER :: ji, jj, jt, jn, jparent, jchild 309 310 DO ji = 1, kvals 311 kindx(ji) = ji 312 END DO 313 314 IF (kvals > 1 ) THEN 315 316 ji = kvals/2 + 1 317 jn = kvals 318 319 main_loop : DO 320 321 IF ( ji > 1 ) THEN 322 ji = ji-1 323 jt = kindx(ji) 324 ELSE 325 jt = kindx(jn) 326 kindx(jn) = kindx(1) 327 jn = jn-1 328 IF ( jn == 1 ) THEN 329 kindx(1) = jt 330 EXIT main_loop 331 ENDIF 332 ENDIF 333 334 jparent = ji 335 jchild = 2*ji 336 337 inner_loop : DO 338 IF ( jchild > jn ) EXIT inner_loop 339 IF ( jchild < jn ) THEN 340 IF ( cdval(kindx(jchild)) < cdval(kindx(jchild+1)) ) THEN 341 jchild = jchild+1 342 ENDIF 343 ENDIF 344 IF ( cdval(jt) < cdval(kindx(jchild))) THEN 345 kindx(jparent) = kindx(jchild) 346 jparent = jchild 347 jchild = jchild*2 348 ELSE 349 jchild = jn + 1 350 ENDIF 351 ENDDO inner_loop 352 353 kindx(jparent) = jt 354 355 END DO main_loop 356 357 ENDIF 358 359 END SUBROUTINE index_sort_string 360 281 361 END MODULE index_sort
Note: See TracChangeset
for help on using the changeset viewer.