Сортировка и связанные функции
В Julia имеется обширная и гибкая API для сортировки и работы с уже отсортированными массивами значений. По умолчанию 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
1
Для сортировки массива на месте используйте «bang» версию функции sort:
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.
Функции сортировки
Base.sort!Функция
sort!(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Отсортируйте вектор v на месте. QuickSort используется по умолчанию для числовых массивов, а MergeSort — для других массивов. Вы можете указать используемый алгоритм с помощью ключевого слова alg (см. Алгоритмы сортировки для доступных алгоритмов). Ключевое слово by позволяет указать функцию, которая будет применена к каждому элементу перед сравнением; ключевое слово lt позволяет указать пользовательскую функцию «меньше» (обратите внимание, что для каждой x и y, только одна из lt(x,y) и lt(y,x) может вернуть true); используйте rev=true для изменения порядка сортировки на обратный. Эти параметры независимы и могут быть использованы вместе во всех возможных комбинациях: если заданы и by, и lt, функция lt применяется к результату функции by; rev=true инвертирует порядок, заданный ключевыми словами by и lt.
Примеры
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")
исходный кодsort!(A; dims::Integer, alg::Algorithm=defalg(A), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Отсортируйте многомерный массив A по размерности dims. См. sort! для описания возможных ключевых аргументов.
Для сортировки срезов массива обратитесь к sortslices.
Для этой функции требуется как минимум Julia 1.1.
Примеры
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 4
исходный код
Base.sortФункция
sort(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Вариант sort!, который возвращает отсортированную копию v, оставив v неизменным.
Примеры
julia> v = [3, 1, 2];
julia> sort(v)
3-element Vector{Int64}:
1
2
3
julia> v
3-element Vector{Int64}:
3
1
2
исходный кодsort(A; dims::Integer, alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Отсортируйте многомерный массив A по заданной размерности. См. sort! для описания возможных ключевых аргументов.
Для сортировки срезов массива обратитесь к sortslices.
Примеры
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 2
исходный код
Base.sortpermФункция
sortperm(v; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Возвращает вектор перестановки I, который упорядочивает v[I] по возрастанию. Порядок задаётся теми же ключевыми словами, что и в sort!. Перестановка гарантированно устойчива, даже если алгоритм сортировки неустойчив, что означает, что индексы равных элементов появляются в порядке возрастания.
См. также sortperm!, partialsortperm, invperm, indexin.
Примеры
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
исходный код
Base.Sort.InsertionSortКонстанта
InsertionSort
Указывает, что функция сортировки должна использовать алгоритм сортировки вставкой. Сортировка вставкой проходит по коллекции по одному элементу за раз, вставляя каждый элемент в его правильное, отсортированное положение в выходном списке.
Характеристики:
- устойчивая: сохраняет порядок элементов, которые сравниваются как равные (например, «a» и «A» при сортировке букв, игнорирующей регистр).
- на месте в памяти.
- квадратичная производительность по количеству элементов для сортировки: подходит для небольших коллекций, но не следует использовать для больших.
Base.Sort.MergeSortКонстанта
MergeSort
Указывает, что функция сортировки должна использовать алгоритм сортировки слиянием. Сортировка слиянием делит коллекцию на подколлекции и многократно сливает их, сортируя каждую подколлекцию на каждом шаге, пока вся коллекция не будет перекомбинирована в отсортированном виде.
Характеристики:
- устойчивая: сохраняет порядок элементов, которые сравниваются как равные (например, «a» и «A» при сортировке букв, игнорирующей регистр).
- не на месте в памяти.
- разделяй и властвуй стратегия сортировки.
Base.Sort.QuickSortКонстанта
QuickSort
Указывает, что функция сортировки должна использовать алгоритм быстрой сортировки, который не устойчив.
Характеристики:
- не устойчивая: не сохраняет порядок элементов, которые сравниваются как равные (например, «a» и «A» при сортировке букв, игнорирующей регистр).
- на месте в памяти.
-
разделяй и властвуй: стратегия сортировки, аналогичная
MergeSort. - хорошая производительность для больших коллекций.
Base.Sort.PartialQuickSortТип
PartialQuickSort{T <: Union{Integer,OrdinalRange}}
Указывает, что функция сортировки должна использовать алгоритм частичной быстрой сортировки. Частичная быстрая сортировка возвращает наименьшие k элементов, отсортированных от наименьшего к наибольшему, находя их и сортируя их с помощью QuickSort.
Характеристики:
- не устойчивая: не сохраняет порядок элементов, которые сравниваются как равные (например, «a» и «A» при сортировке букв, игнорирующей регистр).
- на месте в памяти.
-
разделяй и властвуй: стратегия сортировки, аналогичная
MergeSort.
Base.Sort.sortperm!Функция
sortperm!(ix, v; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward, initialized::Bool=false)
Как sortperm, но принимает предварительно выделенный вектор индексов ix. Если initialized равно false (по умолчанию), ix инициализируется содержащими значения 1:length(v).
Примеры
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
исходный код
Base.sortslicesФункция
sortslices(A; dims, alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Сортировка срезов массива A. Требуемый ключевой аргумент dims должен быть либо целым числом, либо кортежем целых чисел. Он определяет размерность(и), по которым сортируются срезы.
Например, если A является матрицей, dims=1 будет сортировать строки, dims=2 будет сортировать столбцы. Обратите внимание, что по умолчанию функция сравнения для одномерных срезов сортирует лексикографически.
Для остальных ключевых аргументов см. документацию sort!.
Примеры
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 -2
Многомерные массивы
sortslices естественным образом обобщается на многомерные массивы. Например, если A является трёхмерным массивом 2x2x2, sortslices(A, dims=3) будет сортировать срезы внутри третьей размерности, передавая двумерные срезы A[:, :, 1] и A[:, :, 2] функции сравнения. Обратите внимание, что, хотя для многомерных срезов нет порядка по умолчанию, вы можете использовать ключевые аргументы by или lt для указания такого порядка.
Если dims является кортежем, порядок размерностей в dims важен и определяет линейный порядок срезов. Например, если A трёхмерный, а dims равен (1, 2), то порядок первых двух измерений переставляется таким образом, чтобы срезы (оставшейся третьей размерности) были отсортированы. Если dims равен (2, 1) вместо этого, те же срезы будут взяты, но порядок результата будет строчно-главным.
Примеры с многомерными массивами
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Функция
issorted(v, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Проверка, отсортирован ли вектор. Ключевые слова lt, by и rev изменяют понятие сортировки так же, как и для sort.
Примеры
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исходный код
Base.Sort.searchsortedФункция
searchsorted(a, x; by=<transform>, lt=<comparison>, rev=false)
Возвращает диапазон индексов a, которые равны x (используя двоичный поиск) в соответствии с порядком, заданным ключевыми словами by, lt и rev, предполагая, что a уже отсортирован в этом порядке. Возвращает пустой диапазон в точке вставки, если a не содержит значений, равных x.
См. также: insorted, searchsortedfirst, sort, findall.
Примеры
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исходный код
Base.Sort.searchsortedfirstФункция
searchsortedfirst(a, x; by=<transform>, lt=<comparison>, rev=false)
Возвращает индекс первого значения в a больше или равно x, согласно указанному порядку. Возвращает length(a) + 1 если x больше всех значений в a. Предполагается, что a отсортирован.
См. также: searchsortedlast, searchsorted, findfirst.
Примеры
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исходный код
Base.Sort.searchsortedlastФункция
searchsortedlast(a, x; by=<transform>, lt=<comparison>, rev=false)
Возвращает индекс последнего значения в a меньше или равно x, согласно указанному порядку. Возвращает 0 если x меньше всех значений в a. Предполагается, что a отсортирован.
Примеры
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исходный код
Base.Sort.insortedФункция
insorted(a, x; by=<transform>, lt=<comparison>, rev=false) -> Bool
Определяет, содержится ли элемент в заданном отсортированном наборе, в том смысле, что он == одному из значений набора в соответствии с порядком, заданным ключевыми словами by, lt и rev, предполагая, что a уже отсортирован в этом порядке, см. sort для ключевых слов.
См. также in.
Примеры
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
insorted добавлена в Julia 1.6.
Base.Sort.partialsort!Функция
partialsort!(v, k; by=<transform>, lt=<comparison>, rev=false)
Частичная сортировка вектора v на месте, в соответствии с порядком, заданным by, lt и rev, так что значение в индексе k (или диапазоне смежных значений, если k является диапазоном) находится в позиции, где оно появилось бы, если бы массив был полностью отсортирован с помощью нестабильного алгоритма. Если k является одиночным индексом, это значение возвращается; если k является диапазоном, возвращается массив значений в этих индексах. Обратите внимание, что partialsort! не полностью сортирует входной массив.
Примеры
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
1
исходный код
Base.Sort.partialsortФункция
partialsort(v, k, by=<transform>, lt=<comparison>, rev=false)
Вариант partialsort!, который копирует v перед частичной сортировкой, тем самым возвращая то же самое, что и partialsort!, но оставляя v неизменным.
Base.Sort.partialsortpermФункция
partialsortperm(v, k; by=<transform>, lt=<comparison>, rev=false)
Возвращает частичную перестановку I вектора v, так что v[I] возвращает значения полностью отсортированной версии v в индексе k. Если k является диапазоном, возвращается вектор индексов; если k целое число, возвращается одиночный индекс. Порядок задаётся теми же ключевыми словами, что и для sort!. Перестановка устойчива, т.е. индексы равных элементов появляются в порядке возрастания.
Обратите внимание, что эта функция эквивалентна, но эффективнее, чем вызов sortperm(...)[k].
Примеры
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
2
исходный код
Base.Sort.partialsortperm!Функция
partialsortperm!(ix, v, k; by=<transform>, lt=<comparison>, rev=false, initialized=false)
Подобно partialsortperm, но принимает предварительно выделенный вектор индексов ix того же размера, что и v, который используется для хранения (перестановки) индексов v.
Если вектор индексов ix инициализирован индексами v (или их перестановкой), initialized должен быть установлен на true.
Если initialized равен false (по умолчанию), то ix инициализируется, содержащий индексы v.
Если initialized равен true, но ix не содержит (перестановку) индексов v, поведение partialsortperm! не определено.
(Обычно, индексы v будут 1:length(v), хотя если v имеет альтернативный тип массива с индексами, не начинающимися с единицы, например, OffsetArray, ix, то ix также должен быть массивом OffsetArray с теми же индексами, и должен содержать в качестве значений (перестановку) этих индексов.)
По возвращении гарантируется, что ix имеет индексы k в своих отсортированных позициях, так что
partialsortperm!(ix, v, k); v[ix[k]] == partialsort(v, k)
Возвращаемое значение — k-й элемент ix, если k является целым числом, или представление в ix, если k является диапазоном.
Примеры
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, initialized=true)
2-element view(::Vector{Int64}, 2:3) with eltype Int64:
4
3
исходный кодАлгоритмы сортировки
В настоящее время в Julia есть четыре алгоритма сортировки:
InsertionSort — это устойчивый алгоритм сортировки с временной сложностью O(n^2). Он эффективен для очень малых n, и используется внутри QuickSort.
QuickSort — это алгоритм сортировки с временной сложностью O(n log n), который является внутренним, очень быстрым, но не устойчивым — т. е. элементы, считающиеся равными, не сохранят порядок, в котором они изначально находились в массиве, подлежащем сортировке. QuickSort является алгоритмом по умолчанию для числовых значений, включая целые числа и числа с плавающей точкой.
PartialQuickSort(k) похож на QuickSort, но массив вывода сортируется только до индекса k, если k является целым числом, или в диапазоне k, если k является OrdinalRange. Например:
x = rand(1:500, 100) k = 50 k2 = 50:100 s = sort(x; alg=QuickSort) ps = sort(x; alg=PartialQuickSort(k)) qs = sort(x; alg=PartialQuickSort(k2)) map(issorted, (s, ps, qs)) # => (true, false, false) map(x->issorted(x[1:k]), (s, ps, qs)) # => (true, true, false) map(x->issorted(x[k2]), (s, ps, qs)) # => (true, false, true) s[1:k] == ps[1:k] # => true s[k2] == qs[k2] # => true
MergeSort — это устойчивый алгоритм сортировки с временной сложностью O(n log n), но он не внутренний — он требует временного массива размером в половину от размера входного массива — и, как правило, не так быстр, как QuickSort. Он является алгоритмом по умолчанию для нечисловых данных.
Алгоритмы сортировки по умолчанию выбираются на основе того, что они быстры и устойчивы, или, похожи на то. Для числовых типов действительно, QuickSort выбирается, так как он быстрее и в этом случае неотличим от устойчивой сортировки (если массив каким-то образом не фиксирует свои изменения). Свойство устойчивости имеет не незначительную стоимость, поэтому, если вам оно не нужно, вы можете явно указать предпочитаемый алгоритм, например, sort!(v, alg=QuickSort).
Механизм, с помощью которого Julia выбирает алгоритмы сортировки по умолчанию, реализован через функцию Base.Sort.defalg. Она позволяет зарегистрировать определённый алгоритм как алгоритм по умолчанию во всех функциях сортировки для конкретных массивов. Например, вот два алгоритма по умолчанию из sort.jl:
defalg(v::AbstractArray) = MergeSort
defalg(v::AbstractArray{<:Number}) = QuickSort
Что касается числовых массивов, выбор неустойчивого алгоритма по умолчанию для типов массивов, для которых понятие устойчивой сортировки бессмысленно (т. е. когда два значения, сравниваемые как равные, не могут быть различимы), может иметь смысл.
Альтернативные порядки
По умолчанию, sort и связанные с ним функции используют isless для сравнения двух элементов, чтобы определить, какой из них должен стоять первым. Абстрактный тип Base.Order.Ordering предоставляет механизм для определения альтернативных порядков на том же наборе элементов. Экземпляры Ordering определяют тотальный порядок на множестве элементов, так что для любых элементов a, b, c выполняются следующие условия:
- Истинно ровно одно из следующих утверждений:
aменьшеb,bменьшеa, илиaиbравны (согласноisequal). - Отношение транзитивно — если
aменьшеbиbменьшеc, тоaменьшеc.
Функция Base.Order.lt работает как обобщение isless для проверки, меньше ли a b в соответствии с заданным порядком.
Base.Order.OrderingТип
Base.Order.Ordering
Абстрактный тип, представляющий тотальный порядок на некотором наборе элементов.
Используйте Base.Order.lt для сравнения двух элементов в соответствии с порядком.
Base.Order.ltФункция
lt(o::Ordering, a, b)
Проверить, меньше ли a b в соответствии с порядком o.
Base.Order.ordФункция
ord(lt, by, rev::Union{Bool, Nothing}, order::Ordering=Forward)
Создать объект Ordering из тех же аргументов, что и sort!. Элементы сначала преобразуются функцией by (которая может быть identity), а затем сравниваются по функции lt или по существующему порядку order. lt должна быть isless или функцией, которая подчиняется аналогичным правилам. Наконец, результирующий порядок инвертируется, если rev=true.
Передача lt отличного от isless вместе с order отличным от Base.Order.Forward или Base.Order.Reverse запрещена, в противном случае все опции независимы и могут быть использованы вместе во всех возможных комбинациях.
Base.Order.ForwardКонстанта
Base.Order.Forward
Порядок по умолчанию согласно isless.
Base.Order.ReverseOrderingТип
ReverseOrdering(fwd::Ordering=Forward)
Обёртка, которая инвертирует порядок.
Для данного Ordering o, следующее выполняется для всех a, b:
lt(ReverseOrdering(o), a, b) == lt(o, b, a)исходный код
Base.Order.ReverseКонстанта
Base.Order.Reverse
Обратный порядок согласно isless.
Base.Order.ByТип
By(by, order::Ordering=Forward)
Ordering который применяет order к элементам после их преобразования функцией by.
Base.Order.LtТип
Lt(lt)
Ordering который вызывает lt(a, b) для сравнения элементов. lt должен подчиняться тем же правилам, что и реализации isless.
Base.Order.PermТип
Perm(order::Ordering, data::AbstractVector)
Ordering на индексах data, где i меньше j если data[i] меньше data[j] согласно order. В случае, когда data[i] и data[j] равны, i и j сравниваются по числовому значению.
© 2009–2021 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.7.0/base/sort/