# NAG FL Interfacem01daf (realvec_​rank)

## ▸▿ Contents

Settings help

FL Name Style:

FL Specification Language:

## 1Purpose

m01daf ranks a vector of real numbers in ascending or descending order.

## 2Specification

Fortran Interface
 Subroutine m01daf ( rv, m1, m2,
 Integer, Intent (In) :: m1, m2 Integer, Intent (Inout) :: ifail Integer, Intent (Out) :: irank(m2) Real (Kind=nag_wp), Intent (In) :: rv(m2) Character (1), Intent (In) :: order
#include <nag.h>
 void m01daf_ (const double rv[], const Integer *m1, const Integer *m2, const char *order, Integer irank[], Integer *ifail, const Charlen length_order)
The routine may be called by the names m01daf or nagf_sort_realvec_rank.

## 3Description

m01daf uses a variant of list-merging, as described on pages 165–166 in Knuth (1973). The routine takes advantage of natural ordering in the data, and uses a simple list insertion in a preparatory pass to generate ordered lists of length at least $10$. The ranking is stable: equal elements preserve their ordering in the input data.
Knuth D E (1973) The Art of Computer Programming (Volume 3) (2nd Edition) Addison–Wesley

## 5Arguments

1: $\mathbf{rv}\left({\mathbf{m2}}\right)$Real (Kind=nag_wp) array Input
On entry: elements ${\mathbf{m1}}$ to ${\mathbf{m2}}$ of rv must contain real values to be ranked.
2: $\mathbf{m1}$Integer Input
On entry: the index of the first element of rv to be ranked.
Constraint: ${\mathbf{m1}}>0$.
3: $\mathbf{m2}$Integer Input
On entry: the index of the last element of rv to be ranked.
Constraint: ${\mathbf{m2}}\ge {\mathbf{m1}}$.
4: $\mathbf{order}$Character(1) Input
On entry: if ${\mathbf{order}}=\text{'A'}$, the values will be ranked in ascending (i.e., nondecreasing) order.
If ${\mathbf{order}}=\text{'D'}$, into descending order.
Constraint: ${\mathbf{order}}=\text{'A'}$ or $\text{'D'}$.
5: $\mathbf{irank}\left({\mathbf{m2}}\right)$Integer array Output
On exit: elements ${\mathbf{m1}}$ to ${\mathbf{m2}}$ of irank contain the ranks of the corresponding elements of rv. Note that the ranks are in the range m1 to m2: thus, if ${\mathbf{rv}}\left(i\right)$ is the first element in the rank order, ${\mathbf{irank}}\left(i\right)$ is set to m1.
6: $\mathbf{ifail}$Integer Input/Output
On entry: ifail must be set to $0$, $-1$ or $1$ to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of $0$ causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of $-1$ means that an error message is printed while a value of $1$ means that it is not.
If halting is not appropriate, the value $-1$ or $1$ is recommended. If message printing is undesirable, then the value $1$ is recommended. Otherwise, the value $0$ is recommended. When the value $-\mathbf{1}$ or $\mathbf{1}$ is used it is essential to test the value of ifail on exit.
On exit: ${\mathbf{ifail}}={\mathbf{0}}$ unless the routine detects an error or a warning has been flagged (see Section 6).

## 6Error Indicators and Warnings

If on entry ${\mathbf{ifail}}=0$ or $-1$, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
${\mathbf{ifail}}=1$
On entry, ${\mathbf{m1}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{m1}}\ge 1$.
On entry, ${\mathbf{m1}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{m2}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{m1}}\le {\mathbf{m2}}$.
On entry, ${\mathbf{m2}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{m2}}\ge 1$.
${\mathbf{ifail}}=2$
On entry, order has an illegal value: ${\mathbf{order}}=⟨\mathit{\text{value}}⟩$.
${\mathbf{ifail}}=-99$
See Section 7 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-399$
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library FL Interface for further information.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.
See Section 9 in the Introduction to the NAG Library FL Interface for further information.

Not applicable.

## 8Parallelism and Performance

m01daf is not threaded in any implementation.

The average time taken by the routine is approximately proportional to $n×\mathrm{log}\left(n\right)$, where $n={\mathbf{m2}}-{\mathbf{m1}}+1$.

## 10Example

Example 1 reads a list of real numbers and ranks them in ascending order.
Example 2 calculates weighted quantiles by ranking data, inverting the permutation to obtain indices of sorted data and using a binary search.

### 10.1Program Text

Program Text (m01dafe.f90)

### 10.2Program Data

Program Data (m01dafe.d)

### 10.3Program Results

Program Results (m01dafe.r)