return the sorted position of a value in the given dynamic array
if the value was not found, - return 0 if nextifnotfound = .false. - return position at the end if nextifnotfound = .true.
binary search on sorted list
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dyn_longarray_type), | intent(in) | :: | me | |||
integer(kind=long_k), | intent(in) | :: | val | |||
logical, | intent(in), | optional | :: | nextifnotfound |
flag to indicate, if the next entry in the list should be returned, if the searched one is not found. |
|
integer, | intent(in), | optional | :: | lower | ||
integer, | intent(in), | optional | :: | upper |
function sortposofval_long(me, val, nextifnotfound, lower, upper) result(pos)
!------------------------------------------------------------------------
type(dyn_longarray_type), intent(in) :: me !< dynamic array
integer(kind=long_k), intent(in) :: val !< value to look for
!> flag to indicate, if the next entry in the list should be returned,
!! if the searched one is not found.
logical, intent(in), optional :: nextifnotfound
integer, intent(in), optional :: lower !< lower search limit
integer, intent(in), optional :: upper !< upper search limit
integer :: pos !< position of val in the sorted list, 0 if not found
!------------------------------------------------------------------------
logical :: retnext
integer :: lb, ub
integer :: mid
integer(kind=long_k) :: lb_val, ub_val
integer(kind=long_k) :: mid_val
!------------------------------------------------------------------------
retnext = .false.
if (present(nextifnotfound)) retnext = nextifnotfound
lb = 1
ub = me%nvals
if( present( lower ) ) lb = lower
if( present( upper ) ) ub = upper
pos = 0
if (retnext) pos = lb
!> binary search on sorted list
do while(ub >= lb)
lb_val = me%val(me%sorted(lb))
if (val < lb_val) then
if (retnext) pos = lb
exit
end if
ub_val = me%val(me%sorted(ub))
if (val > ub_val) then
if (retnext) pos = ub+1
exit
end if
! safe guard against integer limit overflow
mid = lb + (ub-lb) / 2
mid_val = me%val(me%sorted(mid))
if (val == mid_val) then
pos = mid
exit
end if
if (val > mid_val) then
lb = mid + 1
else
ub = mid - 1
end if
end do
end function sortposofval_long