program demo_orderval_special
! return Nth ordered value of an array
use M_orderpack, only : orderval_special, medianval
implicit none
character(len=*),parameter :: list= '(*(g0:,", "))',sp='(*(g0,1x))'
integer,allocatable :: iarr(:)
integer :: i
iarr=[80,70,30,40,-50,60,20,10]
print sp, 'ORIGINAL:',iarr
! can return the same values as intrinsics minval(3f) and maxval(3f)
print sp, 'minval',orderval_special(iarr,1), minval(iarr)
print sp, 'maxval',orderval_special(iarr,size(iarr)), maxval(iarr)
! but more generally it can return the Nth lowest value.
print sp, 'median',orderval_special(iarr,(size(iarr+1))/2), &
& medianval(iarr)
! so only Nth ordered value can be found
print sp,'inord=',3, ' fractile=',orderval_special(iarr,3)
! sorting the hard way
print sp, 'ORIGINAL:',iarr
do i=1,size(iarr)
write(*,list)i,orderval_special(iarr,i)
enddo
print *
end program demo_orderval_special