排序及相关函数
Julia 拥有广泛而灵活的应用程序接口,可用于对已排序的数组值进行排序和交互。 默认情况下,Julia 会选择合理的算法并按升序排序:
julia> sort([2,3,1])
3-element Vector{Int64}:
1
2
3或者指定使用逆序:
julia> sort([2,3,1], rev=true)
3-element Vector{Int64}:
3
2
1sort 构造一个已排序的副本,保持输入不变。 使用排序函数的"感叹号"版本来修改现有数组:
julia> a = [2,3,1];
julia> sort!(a);
julia> a
3-element Vector{Int64}:
1
2
3除了直接对数组进行排序,你还可以计算一个数组索引的置换,使数组按排序顺序排列:
julia> v = randn(5)
5-element Array{Float64,1}:
0.297288
0.382396
-0.597634
-0.0104452
-0.839027
julia> p = sortperm(v)
5-element Array{Int64,1}:
5
3
4
1
2
julia> v[p]
5-element Array{Float64,1}:
-0.839027
-0.597634
-0.0104452
0.297288
0.382396数组可以根据其值的任意转换进行排序:
julia> sort(v, by=abs)
5-element Array{Float64,1}:
-0.0104452
0.297288
0.382396
-0.597634
-0.839027或者指定使用逆序:
julia> sort(v, by=abs, rev=true)
5-element Array{Float64,1}:
-0.839027
-0.597634
0.382396
0.297288
-0.0104452如有必要,可以选择排序算法:
julia> sort(v, alg=InsertionSort)
5-element Array{Float64,1}:
-0.839027
-0.597634
-0.0104452
0.297288
0.382396所有排序和顺序相关的函数都依赖于一个"小于"关系,该关系在要操作的值上定义了一个 严格弱序。 默认调用 isless 函数,但可以通过 lt 关键字指定关系,这是一个接受两个数组元素的函数, 当且仅当第一个参数"小于"第二个参数时返回 true。 更多信息请参见 sort! 和 替代排序。
排序函数
Base.sort! — Functionsort!(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Sort the vector v in place. A stable algorithm is used by default: the ordering of elements that compare equal is preserved. A specific algorithm can be selected via the alg keyword (see Sorting Algorithms for available algorithms).
Elements are first transformed with the function by and then compared according to either the function lt or the ordering order. Finally, the resulting order is reversed if rev=true (this preserves forward stability: elements that compare equal are not reversed). The current implemention applies the by transformation before each comparison rather than once per element.
Passing an lt other than isless along with an order other than Base.Order.Forward or Base.Order.Reverse is not permitted, otherwise all options are independent and can be used together in all possible combinations. Note that order can also include a "by" transformation, in which case it is applied after that defined with the by keyword. For more information on order values see the documentation on Alternate Orderings.
Relations between two elements are defined as follows (with "less" and "greater" exchanged when rev=true):
xis less thanyiflt(by(x), by(y))(orBase.Order.lt(order, by(x), by(y))) yields true.xis greater thanyifyis less thanx.xandyare equivalent if neither is less than the other ("incomparable" is sometimes used as a synonym for "equivalent").
The result of sort! is sorted in the sense that every element is greater than or equivalent to the previous one.
The lt function must define a strict weak order, that is, it must be
- irreflexive:
lt(x, x)always yieldsfalse, - asymmetric: if
lt(x, y)yieldstruethenlt(y, x)yieldsfalse, - transitive:
lt(x, y) && lt(y, z)implieslt(x, z), - transitive in equivalence:
!lt(x, y) && !lt(y, x)and!lt(y, z) && !lt(z, y)together imply!lt(x, z) && !lt(z, x). In words: ifxandyare equivalent andyandzare equivalent thenxandzmust be equivalent.
For example < is a valid lt function for Int values but ≤ is not: it violates irreflexivity. For Float64 values even < is invalid as it violates the fourth condition: 1.0 and NaN are equivalent and so are NaN and 2.0 but 1.0 and 2.0 are not equivalent.
See also sort, sortperm, sortslices, partialsort!, partialsortperm, issorted, searchsorted, insorted, Base.Order.ord.
Examples
julia> v = [3, 1, 2]; sort!(v); v
3-element Vector{Int64}:
1
2
3
julia> v = [3, 1, 2]; sort!(v, rev = true); v
3-element Vector{Int64}:
3
2
1
julia> v = [(1, "c"), (3, "a"), (2, "b")]; sort!(v, by = x -> x[1]); v
3-element Vector{Tuple{Int64, String}}:
(1, "c")
(2, "b")
(3, "a")
julia> v = [(1, "c"), (3, "a"), (2, "b")]; sort!(v, by = x -> x[2]); v
3-element Vector{Tuple{Int64, String}}:
(3, "a")
(2, "b")
(1, "c")
julia> sort(0:3, by=x->x-2, order=Base.Order.By(abs)) # same as sort(0:3, by=abs(x->x-2))
4-element Vector{Int64}:
2
1
3
0
julia> sort([2, NaN, 1, NaN, 3]) # correct sort with default lt=isless
5-element Vector{Float64}:
1.0
2.0
3.0
NaN
NaN
julia> sort([2, NaN, 1, NaN, 3], lt=<) # wrong sort due to invalid lt. This behavior is undefined.
5-element Vector{Float64}:
2.0
NaN
1.0
NaN
3.0sort!(A; dims::Integer, alg::Algorithm=defalg(A), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Sort the multidimensional array A along dimension dims. See the one-dimensional version of sort! for a description of possible keyword arguments.
To sort slices of an array, refer to sortslices.
This function requires at least Julia 1.1.
Examples
julia> A = [4 3; 1 2]
2×2 Matrix{Int64}:
4 3
1 2
julia> sort!(A, dims = 1); A
2×2 Matrix{Int64}:
1 2
4 3
julia> sort!(A, dims = 2); A
2×2 Matrix{Int64}:
1 2
3 4Base.sort — Functionsort(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Variant of sort! that returns a sorted copy of v leaving v itself unmodified.
Examples
julia> v = [3, 1, 2];
julia> sort(v)
3-element Vector{Int64}:
1
2
3
julia> v
3-element Vector{Int64}:
3
1
2sort(A; dims::Integer, alg::Algorithm=defalg(A), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Sort a multidimensional array A along the given dimension. See sort! for a description of possible keyword arguments.
To sort slices of an array, refer to sortslices.
Examples
julia> A = [4 3; 1 2]
2×2 Matrix{Int64}:
4 3
1 2
julia> sort(A, dims = 1)
2×2 Matrix{Int64}:
1 2
4 3
julia> sort(A, dims = 2)
2×2 Matrix{Int64}:
3 4
1 2Base.sortperm — Functionsortperm(A; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward, [dims::Integer])Return a permutation vector or array I that puts A[I] in sorted order along the given dimension. If A has more than one dimension, then the dims keyword argument must be specified. The order is specified using the same keywords as sort!. The permutation is guaranteed to be stable even if the sorting algorithm is unstable: the indices of equal elements will appear in ascending order.
See also sortperm!, partialsortperm, invperm, indexin. To sort slices of an array, refer to sortslices.
The method accepting dims requires at least Julia 1.9.
Examples
julia> v = [3, 1, 2];
julia> p = sortperm(v)
3-element Vector{Int64}:
2
3
1
julia> v[p]
3-element Vector{Int64}:
1
2
3
julia> A = [8 7; 5 6]
2×2 Matrix{Int64}:
8 7
5 6
julia> sortperm(A, dims = 1)
2×2 Matrix{Int64}:
2 4
1 3
julia> sortperm(A, dims = 2)
2×2 Matrix{Int64}:
3 1
2 4Base.Sort.InsertionSort — ConstantInsertionSortUse the insertion sort algorithm.
Insertion sort traverses the collection one element at a time, inserting each element into its correct, sorted position in the output vector.
Characteristics:
- stable: preserves the ordering of elements that compare equal
(e.g. "a" and "A" in a sort of letters that ignores case).
- in-place in memory.
- quadratic performance in the number of elements to be sorted:
it is well-suited to small collections but should not be used for large ones.
Base.Sort.MergeSort — ConstantMergeSortIndicate that a sorting function should use the merge sort algorithm. Merge sort divides the collection into subcollections and repeatedly merges them, sorting each subcollection at each step, until the entire collection has been recombined in sorted form.
Characteristics:
- stable: preserves the ordering of elements that compare equal (e.g. "a" and "A" in a sort of letters that ignores case).
- not in-place in memory.
- divide-and-conquer sort strategy.
- good performance for large collections but typically not quite as fast as
QuickSort.
Base.Sort.QuickSort — ConstantQuickSortIndicate that a sorting function should use the quick sort algorithm, which is not stable.
Characteristics:
- not stable: does not preserve the ordering of elements that compare equal (e.g. "a" and "A" in a sort of letters that ignores case).
- in-place in memory.
- divide-and-conquer: sort strategy similar to
MergeSort. - good performance for large collections.
Base.Sort.PartialQuickSort — TypePartialQuickSort{T <: Union{Integer,OrdinalRange}}Indicate that a sorting function should use the partial quick sort algorithm. PartialQuickSort(k) is like QuickSort, but is only required to find and sort the elements that would end up in v[k] were v fully sorted.
Characteristics:
- not stable: does not preserve the ordering of elements that compare equal (e.g. "a" and "A" in a sort of letters that ignores case).
- in-place in memory.
- divide-and-conquer: sort strategy similar to
MergeSort.
Note that PartialQuickSort(k) does not necessarily sort the whole array. For example,
julia> x = rand(100);
julia> k = 50:100;
julia> s1 = sort(x; alg=QuickSort);
julia> s2 = sort(x; alg=PartialQuickSort(k));
julia> map(issorted, (s1, s2))
(true, false)
julia> map(x->issorted(x[k]), (s1, s2))
(true, true)
julia> s1[k] == s2[k]
trueBase.Sort.sortperm! — Functionsortperm!(ix, A; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward, [dims::Integer])Like sortperm, but accepts a preallocated index vector or array ix with the same axes as A. ix is initialized to contain the values LinearIndices(A).
Behavior can be unexpected when any mutated argument shares memory with any other argument.
The method accepting dims requires at least Julia 1.9.
Examples
julia> v = [3, 1, 2]; p = zeros(Int, 3);
julia> sortperm!(p, v); p
3-element Vector{Int64}:
2
3
1
julia> v[p]
3-element Vector{Int64}:
1
2
3
julia> A = [8 7; 5 6]; p = zeros(Int,2, 2);
julia> sortperm!(p, A; dims=1); p
2×2 Matrix{Int64}:
2 4
1 3
julia> sortperm!(p, A; dims=2); p
2×2 Matrix{Int64}:
3 1
2 4Base.sortslices — Functionsortslices(A; dims, alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Sort slices of an array A. The required keyword argument dims must be either an integer or a tuple of integers. It specifies the dimension(s) over which the slices are sorted.
E.g., if A is a matrix, dims=1 will sort rows, dims=2 will sort columns. Note that the default comparison function on one dimensional slices sorts lexicographically.
For the remaining keyword arguments, see the documentation of sort!.
Examples
julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1) # Sort rows
3×3 Matrix{Int64}:
-1 6 4
7 3 5
9 -2 8
julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1, lt=(x,y)->isless(x[2],y[2]))
3×3 Matrix{Int64}:
9 -2 8
7 3 5
-1 6 4
julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1, rev=true)
3×3 Matrix{Int64}:
9 -2 8
7 3 5
-1 6 4
julia> sortslices([7 3 5; 6 -1 -4; 9 -2 8], dims=2) # Sort columns
3×3 Matrix{Int64}:
3 5 7
-1 -4 6
-2 8 9
julia> sortslices([7 3 5; 6 -1 -4; 9 -2 8], dims=2, alg=InsertionSort, lt=(x,y)->isless(x[2],y[2]))
3×3 Matrix{Int64}:
5 3 7
-4 -1 6
8 -2 9
julia> sortslices([7 3 5; 6 -1 -4; 9 -2 8], dims=2, rev=true)
3×3 Matrix{Int64}:
7 5 3
6 -4 -1
9 8 -2Higher dimensions
sortslices extends naturally to higher dimensions. E.g., if A is a a 2x2x2 array, sortslices(A, dims=3) will sort slices within the 3rd dimension, passing the 2x2 slices A[:, :, 1] and A[:, :, 2] to the comparison function. Note that while there is no default order on higher-dimensional slices, you may use the by or lt keyword argument to specify such an order.
If dims is a tuple, the order of the dimensions in dims is relevant and specifies the linear order of the slices. E.g., if A is three dimensional and dims is (1, 2), the orderings of the first two dimensions are re-arranged such that the slices (of the remaining third dimension) are sorted. If dims is (2, 1) instead, the same slices will be taken, but the result order will be row-major instead.
Higher dimensional examples
julia> A = permutedims(reshape([4 3; 2 1; 'A' 'B'; 'C' 'D'], (2, 2, 2)), (1, 3, 2))
2×2×2 Array{Any, 3}:
[:, :, 1] =
4 3
2 1
[:, :, 2] =
'A' 'B'
'C' 'D'
julia> sortslices(A, dims=(1,2))
2×2×2 Array{Any, 3}:
[:, :, 1] =
1 3
2 4
[:, :, 2] =
'D' 'B'
'C' 'A'
julia> sortslices(A, dims=(2,1))
2×2×2 Array{Any, 3}:
[:, :, 1] =
1 2
3 4
[:, :, 2] =
'D' 'C'
'B' 'A'
julia> sortslices(reshape([5; 4; 3; 2; 1], (1,1,5)), dims=3, by=x->x[1,1])
1×1×5 Array{Int64, 3}:
[:, :, 1] =
1
[:, :, 2] =
2
[:, :, 3] =
3
[:, :, 4] =
4
[:, :, 5] =
5排列顺序相关的函数
Base.issorted — Functionissorted(v, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)Test whether a collection is in sorted order. The keywords modify what order is considered sorted, as described in the sort! documentation.
Examples
julia> issorted([1, 2, 3])
true
julia> issorted([(1, "b"), (2, "a")], by = x -> x[1])
true
julia> issorted([(1, "b"), (2, "a")], by = x -> x[2])
false
julia> issorted([(1, "b"), (2, "a")], by = x -> x[2], rev=true)
true
julia> issorted([1, 2, -2, 3], by=abs)
trueBase.Sort.searchsorted — Functionsearchsorted(v, x; by=identity, lt=isless, rev=false)Return the range of indices in v where values are equivalent to x, or an empty range located at the insertion point if v does not contain values equivalent to x. The vector v must be sorted according to the order defined by the keywords. Refer to sort! for the meaning of the keywords and the definition of equivalence. Note that the by function is applied to the searched value x as well as the values in v.
The range is generally found using binary search, but there are optimized implementations for some inputs.
See also: searchsortedfirst, sort!, insorted, findall.
Examples
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # single match
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # multiple matches
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
1:0
julia> searchsorted([1=>"one", 2=>"two", 2=>"two", 4=>"four"], 2=>"two", by=first) # compare the keys of the pairs
2:3Base.Sort.searchsortedfirst — Functionsearchsortedfirst(v, x; by=identity, lt=isless, rev=false)Return the index of the first value in v greater than or equivalent to x. If x is greater than all values in v, return lastindex(v) + 1.
The vector v must be sorted according to the order defined by the keywords. insert!ing x at the returned index will maintain the sorted order. Refer to sort! for the meaning of the keywords and the definition of "greater than" and equivalence. Note that the by function is applied to the searched value x as well as the values in v.
The index is generally found using binary search, but there are optimized implementations for some inputs.
See also: searchsortedlast, searchsorted, findfirst.
Examples
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 4) # single match
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 5) # multiple matches
4
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
7
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
1
julia> searchsortedfirst([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # compare the keys of the pairs
3Base.Sort.searchsortedlast — Functionsearchsortedlast(v, x; by=identity, lt=isless, rev=false)Return the index of the last value in v less than or equivalent to x. If x is less than all values in v the function returns firstindex(v) - 1.
The vector v must be sorted according to the order defined by the keywords. Refer to sort! for the meaning of the keywords and the definition of "less than" and equivalence. Note that the by function is applied to the searched value x as well as the values in v.
The index is generally found using binary search, but there are optimized implementations for some inputs
Examples
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 4) # single match
3
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 5) # multiple matches
5
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 3) # no match, insert in the middle
2
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 9) # no match, insert at end
6
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 0) # no match, insert at start
0
julia> searchsortedlast([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # compare the keys of the pairs
2Base.Sort.insorted — Functioninsorted(x, v; by=identity, lt=isless, rev=false) -> BoolDetermine whether a vector v contains any value equivalent to x. The vector v must be sorted according to the order defined by the keywords. Refer to sort! for the meaning of the keywords and the definition of equivalence. Note that the by function is applied to the searched value x as well as the values in v.
The check is generally done using binary search, but there are optimized implementations for some inputs.
See also in.
Examples
julia> insorted(4, [1, 2, 4, 5, 5, 7]) # single match
true
julia> insorted(5, [1, 2, 4, 5, 5, 7]) # multiple matches
true
julia> insorted(3, [1, 2, 4, 5, 5, 7]) # no match
false
julia> insorted(9, [1, 2, 4, 5, 5, 7]) # no match
false
julia> insorted(0, [1, 2, 4, 5, 5, 7]) # no match
false
julia> insorted(2=>"TWO", [1=>"one", 2=>"two", 4=>"four"], by=first) # compare the keys of the pairs
trueinsorted was added in Julia 1.6.
Base.Sort.partialsort! — Functionpartialsort!(v, k; by=identity, lt=isless, rev=false)Partially sort the vector v in place so that the value at index k (or range of adjacent values if k is a range) occurs at the position where it would appear if the array were fully sorted. If k is a single index, that value is returned; if k is a range, an array of values at those indices is returned. Note that partialsort! may not fully sort the input array.
For the keyword arguments, see the documentation of sort!.
Examples
julia> a = [1, 2, 4, 3, 4]
5-element Vector{Int64}:
1
2
4
3
4
julia> partialsort!(a, 4)
4
julia> a
5-element Vector{Int64}:
1
2
3
4
4
julia> a = [1, 2, 4, 3, 4]
5-element Vector{Int64}:
1
2
4
3
4
julia> partialsort!(a, 4, rev=true)
2
julia> a
5-element Vector{Int64}:
4
4
3
2
1Base.Sort.partialsort — Functionpartialsort(v, k, by=identity, lt=isless, rev=false)Variant of partialsort! that copies v before partially sorting it, thereby returning the same thing as partialsort! but leaving v unmodified.
Base.Sort.partialsortperm — Functionpartialsortperm(v, k; by=ientity, lt=isless, rev=false)Return a partial permutation I of the vector v, so that v[I] returns values of a fully sorted version of v at index k. If k is a range, a vector of indices is returned; if k is an integer, a single index is returned. The order is specified using the same keywords as sort!. The permutation is stable: the indices of equal elements will appear in ascending order.
This function is equivalent to, but more efficient than, calling sortperm(...)[k].
Examples
julia> v = [3, 1, 2, 1];
julia> v[partialsortperm(v, 1)]
1
julia> p = partialsortperm(v, 1:3)
3-element view(::Vector{Int64}, 1:3) with eltype Int64:
2
4
3
julia> v[p]
3-element Vector{Int64}:
1
1
2Base.Sort.partialsortperm! — Functionpartialsortperm!(ix, v, k; by=identity, lt=isless, rev=false)Like partialsortperm, but accepts a preallocated index vector ix the same size as v, which is used to store (a permutation of) the indices of v.
ix is initialized to contain the indices of v.
(Typically, the indices of v will be 1:length(v), although if v has an alternative array type with non-one-based indices, such as an OffsetArray, ix must share those same indices)
Upon return, ix is guaranteed to have the indices k in their sorted positions, such that
partialsortperm!(ix, v, k);
v[ix[k]] == partialsort(v, k)The return value is the kth element of ix if k is an integer, or view into ix if k is a range.
Behavior can be unexpected when any mutated argument shares memory with any other argument.
Examples
julia> v = [3, 1, 2, 1];
julia> ix = Vector{Int}(undef, 4);
julia> partialsortperm!(ix, v, 1)
2
julia> ix = [1:4;];
julia> partialsortperm!(ix, v, 2:3)
2-element view(::Vector{Int64}, 2:3) with eltype Int64:
4
3排序算法
基础 Julia 中目前有四种公开可用的排序算法:
默认情况下,sort 系列函数使用稳定的排序算法,这些算法在大多数输入上都很快。 具体的算法选择是实现细节,以便于未来的性能改进。
目前,基于输入类型、大小和组成,使用了 RadixSort、ScratchQuickSort、InsertionSort 和 CountingSort 的混合算法。 实现细节可能会发生变化,但目前可以在 ??Base.DEFAULT_STABLE 的扩展帮助和其中列出的内部排序算法的文档字符串中找到。
你可以使用 alg 关键字显式指定你偏好的算法(例如 sort!(v, alg=PartialQuickSort(10:20))), 或者通过向 Base.Sort.defalg 函数添加专门的方法来重新配置自定义类型的默认排序算法。 例如,InlineStrings.jl 定义了以下方法:
Base.Sort.defalg(::AbstractArray{<:Union{SmallInlineStrings, Missing}}) = InlineStringSort默认排序算法(由 Base.Sort.defalg 返回)自 Julia 1.9 起保证是稳定的。 之前的版本在排序数值数组时有不稳定的边缘情况。
替代排序
默认情况下,sort、searchsorted 和相关函数使用 isless 来比较两个元素,以确定哪个应该排在前面。 Base.Order.Ordering 抽象类型提供了一种机制,用于在相同的元素集上定义替代排序: 当调用像 sort! 这样的排序函数时,可以通过关键字参数 order 提供一个 Ordering 实例。
Ordering 的实例通过 Base.Order.lt 函数定义排序,该函数作为 isless 的泛化。 这个函数在自定义 Ordering 上的行为必须满足 严格弱序 的所有条件。 有关有效和无效 lt 函数的详细信息和示例,请参见 sort!。
Base.Order.Ordering — TypeBase.Order.OrderingAbstract type which represents a total order on some set of elements.
Use Base.Order.lt to compare two elements according to the ordering.
Base.Order.lt — Functionlt(o::Ordering, a, b)Test whether a is less than b according to the ordering o.
Base.Order.ord — Functionord(lt, by, rev::Union{Bool, Nothing}, order::Ordering=Forward)Construct an Ordering object from the same arguments used by sort!. Elements are first transformed by the function by (which may be identity) and are then compared according to either the function lt or an existing ordering order. lt should be isless or a function that obeys the same rules as the lt parameter of sort!. Finally, the resulting order is reversed if rev=true.
Passing an lt other than isless along with an order other than Base.Order.Forward or Base.Order.Reverse is not permitted, otherwise all options are independent and can be used together in all possible combinations.
Base.Order.Forward — ConstantBase.Order.ForwardDefault ordering according to isless.
Base.Order.ReverseOrdering — TypeReverseOrdering(fwd::Ordering=Forward)A wrapper which reverses an ordering.
For a given Ordering o, the following holds for all a, b:
lt(ReverseOrdering(o), a, b) == lt(o, b, a)Base.Order.Reverse — ConstantBase.Order.ReverseReverse ordering according to isless.
Base.Order.By — TypeBy(by, order::Ordering=Forward)Ordering which applies order to elements after they have been transformed by the function by.
Base.Order.Lt — TypeLt(lt)Ordering that calls lt(a, b) to compare elements. lt must obey the same rules as the lt parameter of sort!.
Base.Order.Perm — TypePerm(order::Ordering, data::AbstractVector)Ordering on the indices of data where i is less than j if data[i] is less than data[j] according to order. In the case that data[i] and data[j] are equal, i and j are compared by numeric value.