24 #include "../base/base_uses.f90"
46 INTEGER,
INTENT(IN) :: n
47 REAL(kind=
sp),
DIMENSION(1:n),
INTENT(INOUT) :: arr
48 integer,
DIMENSION(1:n),
INTENT(INOUT) :: indices
51 REAL(kind=
sp),
ALLOCATABLE :: tmp_arr(:)
52 INTEGER,
ALLOCATABLE :: tmp_idx(:)
56 ALLOCATE (tmp_arr((n + 1)/2), tmp_idx((n + 1)/2))
58 indices = (/(i, i=1, n)/)
60 CALL cp_1d_s_sort_low(arr(1:n), indices, tmp_arr, tmp_idx)
62 DEALLOCATE (tmp_arr, tmp_idx)
79 RECURSIVE SUBROUTINE cp_1d_s_sort_low(arr, indices, tmp_arr, tmp_idx)
80 REAL(kind=
sp),
DIMENSION(:),
INTENT(INOUT) :: arr
81 INTEGER,
DIMENSION(size(arr)),
INTENT(INOUT) :: indices
82 REAL(kind=
sp),
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_arr
83 INTEGER,
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_idx
85 INTEGER :: t, m, i, j, k
92 IF (
size(arr) <= 7)
THEN
93 DO j =
size(arr) - 1, 1, -1
96 IF (cp_1d_s_less_than(arr(i + 1), arr(i)))
THEN
103 indices(i) = indices(i + 1)
108 IF (.NOT. swapped)
EXIT
114 m = (
size(arr) + 1)/2
115 CALL cp_1d_s_sort_low(arr(1:m), indices(1:m), tmp_arr, tmp_idx)
116 CALL cp_1d_s_sort_low(arr(m + 1:), indices(m + 1:), tmp_arr, tmp_idx)
120 IF (cp_1d_s_less_than(arr(m + 1), arr(m)))
THEN
123 tmp_arr(1:m) = arr(1:m)
124 tmp_idx(1:m) = indices(1:m)
129 DO WHILE (i <= m .and. j <=
size(arr) - m)
130 IF (cp_1d_s_less_than(arr(m + j), tmp_arr(i)))
THEN
132 indices(k) = indices(m + j)
136 indices(k) = tmp_idx(i)
146 indices(k) = tmp_idx(i)
153 END SUBROUTINE cp_1d_s_sort_low
156 PURE FUNCTION cp_1d_s_less_than(a, b)
RESULT(res)
157 REAL(kind=
sp),
INTENT(IN) :: a, b
160 END FUNCTION cp_1d_s_less_than
174 INTEGER,
INTENT(IN) :: n
175 REAL(kind=
dp),
DIMENSION(1:n),
INTENT(INOUT) :: arr
176 integer,
DIMENSION(1:n),
INTENT(INOUT) :: indices
179 REAL(kind=
dp),
ALLOCATABLE :: tmp_arr(:)
180 INTEGER,
ALLOCATABLE :: tmp_idx(:)
184 ALLOCATE (tmp_arr((n + 1)/2), tmp_idx((n + 1)/2))
186 indices = (/(i, i=1, n)/)
188 CALL cp_1d_r_sort_low(arr(1:n), indices, tmp_arr, tmp_idx)
190 DEALLOCATE (tmp_arr, tmp_idx)
207 RECURSIVE SUBROUTINE cp_1d_r_sort_low(arr, indices, tmp_arr, tmp_idx)
208 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: arr
209 INTEGER,
DIMENSION(size(arr)),
INTENT(INOUT) :: indices
210 REAL(kind=
dp),
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_arr
211 INTEGER,
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_idx
213 INTEGER :: t, m, i, j, k
220 IF (
size(arr) <= 7)
THEN
221 DO j =
size(arr) - 1, 1, -1
224 IF (cp_1d_r_less_than(arr(i + 1), arr(i)))
THEN
231 indices(i) = indices(i + 1)
236 IF (.NOT. swapped)
EXIT
242 m = (
size(arr) + 1)/2
243 CALL cp_1d_r_sort_low(arr(1:m), indices(1:m), tmp_arr, tmp_idx)
244 CALL cp_1d_r_sort_low(arr(m + 1:), indices(m + 1:), tmp_arr, tmp_idx)
248 IF (cp_1d_r_less_than(arr(m + 1), arr(m)))
THEN
251 tmp_arr(1:m) = arr(1:m)
252 tmp_idx(1:m) = indices(1:m)
257 DO WHILE (i <= m .and. j <=
size(arr) - m)
258 IF (cp_1d_r_less_than(arr(m + j), tmp_arr(i)))
THEN
260 indices(k) = indices(m + j)
264 indices(k) = tmp_idx(i)
274 indices(k) = tmp_idx(i)
281 END SUBROUTINE cp_1d_r_sort_low
284 PURE FUNCTION cp_1d_r_less_than(a, b)
RESULT(res)
285 REAL(kind=
dp),
INTENT(IN) :: a, b
288 END FUNCTION cp_1d_r_less_than
302 INTEGER,
INTENT(IN) :: n
303 INTEGER(kind=int_4),
DIMENSION(1:n),
INTENT(INOUT) :: arr
304 integer,
DIMENSION(1:n),
INTENT(INOUT) :: indices
307 INTEGER(kind=int_4),
ALLOCATABLE :: tmp_arr(:)
308 INTEGER,
ALLOCATABLE :: tmp_idx(:)
312 ALLOCATE (tmp_arr((n + 1)/2), tmp_idx((n + 1)/2))
314 indices = (/(i, i=1, n)/)
316 CALL cp_1d_i4_sort_low(arr(1:n), indices, tmp_arr, tmp_idx)
318 DEALLOCATE (tmp_arr, tmp_idx)
335 RECURSIVE SUBROUTINE cp_1d_i4_sort_low(arr, indices, tmp_arr, tmp_idx)
336 INTEGER(kind=int_4),
DIMENSION(:),
INTENT(INOUT) :: arr
337 INTEGER,
DIMENSION(size(arr)),
INTENT(INOUT) :: indices
338 INTEGER(kind=int_4),
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_arr
339 INTEGER,
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_idx
340 INTEGER(kind=int_4) :: a
341 INTEGER :: t, m, i, j, k
348 IF (
size(arr) <= 7)
THEN
349 DO j =
size(arr) - 1, 1, -1
352 IF (cp_1d_i4_less_than(arr(i + 1), arr(i)))
THEN
359 indices(i) = indices(i + 1)
364 IF (.NOT. swapped)
EXIT
370 m = (
size(arr) + 1)/2
371 CALL cp_1d_i4_sort_low(arr(1:m), indices(1:m), tmp_arr, tmp_idx)
372 CALL cp_1d_i4_sort_low(arr(m + 1:), indices(m + 1:), tmp_arr, tmp_idx)
376 IF (cp_1d_i4_less_than(arr(m + 1), arr(m)))
THEN
379 tmp_arr(1:m) = arr(1:m)
380 tmp_idx(1:m) = indices(1:m)
385 DO WHILE (i <= m .and. j <=
size(arr) - m)
386 IF (cp_1d_i4_less_than(arr(m + j), tmp_arr(i)))
THEN
388 indices(k) = indices(m + j)
392 indices(k) = tmp_idx(i)
402 indices(k) = tmp_idx(i)
409 END SUBROUTINE cp_1d_i4_sort_low
412 PURE FUNCTION cp_1d_i4_less_than(a, b)
RESULT(res)
413 INTEGER(kind=int_4),
INTENT(IN) :: a, b
416 END FUNCTION cp_1d_i4_less_than
430 INTEGER,
INTENT(IN) :: n
431 INTEGER(kind=int_8),
DIMENSION(1:n),
INTENT(INOUT) :: arr
432 integer,
DIMENSION(1:n),
INTENT(INOUT) :: indices
435 INTEGER(kind=int_8),
ALLOCATABLE :: tmp_arr(:)
436 INTEGER,
ALLOCATABLE :: tmp_idx(:)
440 ALLOCATE (tmp_arr((n + 1)/2), tmp_idx((n + 1)/2))
442 indices = (/(i, i=1, n)/)
444 CALL cp_1d_i8_sort_low(arr(1:n), indices, tmp_arr, tmp_idx)
446 DEALLOCATE (tmp_arr, tmp_idx)
463 RECURSIVE SUBROUTINE cp_1d_i8_sort_low(arr, indices, tmp_arr, tmp_idx)
464 INTEGER(kind=int_8),
DIMENSION(:),
INTENT(INOUT) :: arr
465 INTEGER,
DIMENSION(size(arr)),
INTENT(INOUT) :: indices
466 INTEGER(kind=int_8),
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_arr
467 INTEGER,
DIMENSION((size(arr) + 1)/2),
INTENT(INOUT) :: tmp_idx
468 INTEGER(kind=int_8) :: a
469 INTEGER :: t, m, i, j, k
476 IF (
size(arr) <= 7)
THEN
477 DO j =
size(arr) - 1, 1, -1
480 IF (cp_1d_i8_less_than(arr(i + 1), arr(i)))
THEN
487 indices(i) = indices(i + 1)
492 IF (.NOT. swapped)
EXIT
498 m = (
size(arr) + 1)/2
499 CALL cp_1d_i8_sort_low(arr(1:m), indices(1:m), tmp_arr, tmp_idx)
500 CALL cp_1d_i8_sort_low(arr(m + 1:), indices(m + 1:), tmp_arr, tmp_idx)
504 IF (cp_1d_i8_less_than(arr(m + 1), arr(m)))
THEN
507 tmp_arr(1:m) = arr(1:m)
508 tmp_idx(1:m) = indices(1:m)
513 DO WHILE (i <= m .and. j <=
size(arr) - m)
514 IF (cp_1d_i8_less_than(arr(m + j), tmp_arr(i)))
THEN
516 indices(k) = indices(m + j)
520 indices(k) = tmp_idx(i)
530 indices(k) = tmp_idx(i)
537 END SUBROUTINE cp_1d_i8_sort_low
540 PURE FUNCTION cp_1d_i8_less_than(a, b)
RESULT(res)
541 INTEGER(kind=int_8),
INTENT(IN) :: a, b
544 END FUNCTION cp_1d_i8_less_than
Routine for sorting an array.
subroutine, public cp_1d_i4_sort(arr, n, indices)
Sorts an array inplace using a combination of merge- and bubble-sort. It also returns the indices,...
subroutine, public cp_1d_i8_sort(arr, n, indices)
Sorts an array inplace using a combination of merge- and bubble-sort. It also returns the indices,...
subroutine, public cp_1d_s_sort(arr, n, indices)
Sorts an array inplace using a combination of merge- and bubble-sort. It also returns the indices,...
subroutine, public cp_1d_r_sort(arr, n, indices)
Sorts an array inplace using a combination of merge- and bubble-sort. It also returns the indices,...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public sp
integer, parameter, public int_4