orderval(3f) - [M_orderpack:FRACTILE] Return VALUE of Nth ordered element of array (Quick-Sort-like)
Synopsis
Description
Options
Returns
Examples
Author
Maintainer
License
Function OrderVal (INVALS, NORD)
${TYPE} (Kind=${KIND}), Intent (In) :: INVALS(:) ${TYPE} (Kind=${KIND}) :: orderval Integer, Intent (In) :: NORDWhere ${TYPE}(kind=${KIND}) may be
o Real(kind=real32) o Real(kind=real64) o Integer(kind=int32)
ORDERVAL(3f) returns the NORDth (ascending order) value of INVALS, i.e. the fractile of order NORD/SIZE(INVALS).Internally, this subroutine simply calls ORDERLOC(3f).
This routine uses a pivoting strategy such as the one of finding the median based on the Quick-Sort algorithm, but we skew the pivot choice to try to bring it to NORD as fast as possible. It uses two temporary arrays, where it stores the indices of the values smaller than the pivot (ILOWT), and the indices of values larger than the pivot that we might still need later on (IHIGT). It iterates until it can bring the number of values in ILOWT to exactly NORD, and then finds the maximum of this set.
INVALS array to search NORD Nth lowest value to find
orderval Nth lowest value
Sample program:
program demo_orderval ! Return value of Nth lowest value of array use M_orderpack, only : orderval implicit none character(len=*),parameter :: list= (*(g0:,", ")) character(len=*),parameter :: sp=(*(g0,1x)) real,parameter :: INVALS(*)=[1.1,20.20,3.3,10.10,5.5,4.4,2.2] integer :: i integer :: imiddle write(*,list) ORIGINAL:,INVALS ! can return the same values as intrinsics minval(3f) and maxval(3f) print sp, minval,orderval(INVALS,1), minval(INVALS) print sp, maxval,orderval(INVALS,size(INVALS)), maxval(INVALS) ! but more generally it can return the Nth lowest value. print sp,nord=,4, fractile=,orderval(INVALS,4) ! so a value at the middle would be imiddle=(size(INVALS)+1)/2 print sp,median,orderval(INVALS,imiddle) ! sorting the hard way do i=1,size(INVALS) write(*,list)i,orderval(INVALS,i) enddo end program demo_ordervalResults:
ORIGINAL:, 1.1000, 20.200, 3.300, 10.100, 5.500, 4.400, 2.200 minval 1.100 1.100 maxval 20.200 20.200 nord= 4 fractile= 4.400 median 4.400 1, 1.100 2, 2.200 3, 3.300 4, 4.400 5, 5.500 6, 10.100 7, 20.200
Michel Olagnon - Aug. 2000
John Urban, 2022.04.16
CC0-1.0
Nemo Release 3.1 | orderval (3) | February 23, 2025 |