| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=int64), | intent(inout), | dimension(:) | :: | array | ||
| integer(kind=int64), | intent(inout), | optional, | dimension(:), target | :: | work | |
| logical, | intent(in), | optional | :: | reverse |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=int_index), | private | :: | N | ||||
| integer(kind=int64), | private, | dimension(:), pointer | :: | buffer | |||
| integer(kind=int_index), | private | :: | end | ||||
| integer(kind=int_index), | private | :: | i | ||||
| integer(kind=int64), | private | :: | item | ||||
| integer(kind=int_index), | private | :: | middle | ||||
| integer(kind=int_index), | private | :: | start | ||||
| logical, | private | :: | use_internal_buffer |
pure module subroutine int64_radix_sort(array, work, reverse) integer(kind=int64), dimension(:), intent(inout) :: array integer(kind=int64), dimension(:), intent(inout), target, optional :: work logical, intent(in), optional :: reverse integer(kind=int_index) :: i, N, start, middle, end integer(kind=int64), dimension(:), pointer :: buffer integer(kind=int64) :: item logical :: use_internal_buffer N = size(array, kind=int_index) if (present(work)) then if (size(work, kind=int_index) < N) then error stop "int64_radix_sort: work array is too small." end if use_internal_buffer = .false. buffer => work else use_internal_buffer = .true. allocate (buffer(N)) end if call radix_sort_u64_helper(N, array, buffer) if (array(1) >= 0 .and. array(N) < 0) then start = 1 end = N middle = (1 + N)/2 do while (.true.) if (array(middle) >= 0) then start = middle + 1 else end = middle end if middle = (start + end)/2 if (start == end) exit end do buffer(1:(N - middle + 1)) = array(middle:N) buffer(N - middle + 2:N) = array(1:middle - 1) array(:) = buffer(:) end if if (pic_optional(reverse, .false.)) then do i = 1, N/2 item = array(i) array(i) = array(N - i + 1) array(N - i + 1) = item end do end if if (use_internal_buffer) then deallocate (buffer) end if end subroutine int64_radix_sort