Sort
Sort Up and Sort Down are monadic functions that order the major cells of an array in ascending or descending order. Traditionally these functions are performed using Grade in APL: for example the FinnAPL idiom library gives X[⍋X]
and X[⍒X]
to sort X
ascending and descending, respectively. In several dialects or other array languages they are defined as primitives, but with widely varying glyphs: ∧∨
Extended Dyalog APL, Kap, and BQN, <>
in dzaima/APL, and ≤≥
in Dyalog APL Vision, as well as ^
for ascending sort in K9 and Goal.
In Dyalog APL there are several recognized idioms for sorting: for ascending sorting, {⍵[⍋⍵]}
and {⍵[⍋⍵;]}
to sort rank 1 and 2 arrays specifically, and {(⊂⍋⍵)⌷⍵}
to sort any rank (all idioms have the same performance; the rank-specific ones were defined first and are shorter). The same idioms are recognized for descending sorting, replacing ⍋
with ⍒
.
Sorting with Grade is easiest using the Select (⊇
) or From function, which for example allows the ascending sort function on any rank to be written as the train ⍋⊇⊢
in dzaima/APL. Using Reverse Compose ⍛
as implemented in Kap or Dyalog APL Vision, it can be written ⍋⍛⊇
. In J, it's implemented as Sort By (/:
for ascending) with Commute, /:~
.
A dedicated sorting implementation can be substantially faster than grade and selection both because sorting is generally faster than grade (particularly for long vectors with small-width elements, where an index may take more storage space than an element) and because selection is cache-unfriendly. For small-range data, a moveless variant of counting sort is possible for sorting but not grading.[1] Flags for sorted data, which can be used to optimize various operations on the flagged array, can more easily be set with a dedicated sorting function.[2]
Documentation
References
- ↑ Marshall Lochbaum. Implementation of ordering functions. BQN implementation notes.
- ↑ Marshall Lochbaum. Sortedness flags in primitive implementation. BQN implementation notes.