Sorting and Related Functions
Julia verfügt über eine umfangreiche, flexible API zum Sortieren und Interagieren mit bereits sortierten Arrays von Werten. Standardmäßig wählt Julia angemessene Algorithmen und sortiert in aufsteigender Reihenfolge:
julia> sort([2,3,1])
3-element Vector{Int64}:
1
2
3
Sie können auch in umgekehrter Reihenfolge sortieren:
julia> sort([2,3,1], rev=true)
3-element Vector{Int64}:
3
2
1
sort
erstellt eine sortierte Kopie, ohne die Eingabe zu ändern. Verwenden Sie die "Bang"-Version der Sortierfunktion, um ein vorhandenes Array zu verändern:
julia> a = [2,3,1];
julia> sort!(a);
julia> a
3-element Vector{Int64}:
1
2
3
Anstatt ein Array direkt zu sortieren, können Sie eine Permutation der Indizes des Arrays berechnen, die das Array in sortierter Reihenfolge anordnet:
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
Arrays können gemäß einer willkürlichen Transformation ihrer Werte sortiert werden:
julia> sort(v, by=abs)
5-element Array{Float64,1}:
-0.0104452
0.297288
0.382396
-0.597634
-0.839027
Oder in umgekehrter Reihenfolge durch eine Transformation:
julia> sort(v, by=abs, rev=true)
5-element Array{Float64,1}:
-0.839027
-0.597634
0.382396
0.297288
-0.0104452
Falls erforderlich, kann der Sortieralgorithmus ausgewählt werden:
julia> sort(v, alg=InsertionSort)
5-element Array{Float64,1}:
-0.839027
-0.597634
-0.0104452
0.297288
0.382396
Alle Sortier- und ordnungsbezogenen Funktionen basieren auf einer "kleiner als" Relation, die eine strict weak order der zu manipulierenden Werte definiert. Die isless
-Funktion wird standardmäßig aufgerufen, aber die Relation kann über das lt
-Schlüsselwort angegeben werden, eine Funktion, die zwei Array-Elemente entgegennimmt und true
zurückgibt, wenn und nur wenn das erste Argument "kleiner als" das zweite ist. Siehe sort!
und Alternate Orderings für weitere Informationen.
Sorting Functions
Base.sort!
— Functionsort!(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Sortiere den Vektor v
in-place. Standardmäßig wird ein stabiles Algorithmus verwendet: die Reihenfolge der Elemente, die gleich sind, bleibt erhalten. Ein spezifischer Algorithmus kann über das Schlüsselwort alg
ausgewählt werden (siehe Sortieralgorithmen für verfügbare Algorithmen).
Die Elemente werden zuerst mit der Funktion by
transformiert und dann entweder gemäß der Funktion lt
oder der Reihenfolge order
verglichen. Schließlich wird die resultierende Reihenfolge umgekehrt, wenn rev=true
(dies bewahrt die Vorwärtsstabilität: Elemente, die gleich sind, werden nicht umgekehrt). Die aktuelle Implementierung wendet die by
-Transformation vor jedem Vergleich an, anstatt einmal pro Element.
Das Übergeben eines lt
, das nicht isless
ist, zusammen mit einer order
, die nicht Base.Order.Forward
oder Base.Order.Reverse
ist, ist nicht erlaubt; andernfalls sind alle Optionen unabhängig und können in allen möglichen Kombinationen zusammen verwendet werden. Beachte, dass order
auch eine "by"-Transformation enthalten kann, in diesem Fall wird sie nach der mit dem Schlüsselwort by
definierten angewendet. Für weitere Informationen zu order
-Werten siehe die Dokumentation zu Alternativen Reihenfolgen.
Die Beziehungen zwischen zwei Elementen sind wie folgt definiert (mit "weniger" und "größer" vertauscht, wenn rev=true
):
x
ist kleiner alsy
, wennlt(by(x), by(y))
(oderBase.Order.lt(order, by(x), by(y))
) wahr ergibt.x
ist größer alsy
, wenny
kleiner alsx
ist.x
undy
sind äquivalent, wenn keiner kleiner als der andere ist ("nicht vergleichbar" wird manchmal als Synonym für "äquivalent" verwendet).
Das Ergebnis von sort!
ist so sortiert, dass jedes Element größer oder äquivalent zum vorherigen ist.
Die lt
-Funktion muss eine strikte schwache Ordnung definieren, das heißt, sie muss
- irreflexiv sein:
lt(x, x)
ergibt immerfalse
, - asymmetrisch sein: wenn
lt(x, y)
true
ergibt, dann ergibtlt(y, x)
false
, - transitiv sein:
lt(x, y) && lt(y, z)
impliziertlt(x, z)
, - transitiv in der Äquivalenz sein:
!lt(x, y) && !lt(y, x)
und!lt(y, z) && !lt(z, y)
implizieren zusammen!lt(x, z) && !lt(z, x)
. Mit anderen Worten: wennx
undy
äquivalent sind undy
undz
äquivalent sind, dann müssenx
undz
äquivalent sein.
Zum Beispiel ist <
eine gültige lt
-Funktion für Int
-Werte, aber ≤
ist es nicht: es verletzt die Irreflexivität. Für Float64
-Werte ist sogar <
ungültig, da es die vierte Bedingung verletzt: 1.0
und NaN
sind äquivalent und ebenso NaN
und 2.0
, aber 1.0
und 2.0
sind nicht äquivalent.
Siehe auch sort
, sortperm
, sortslices
, partialsort!
, partialsortperm
, issorted
, searchsorted
, insorted
, Base.Order.ord
.
Beispiele
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)) # dasselbe wie sort(0:3, by=abs(x->x-2))
4-element Vector{Int64}:
2
1
3
0
julia> sort([2, NaN, 1, NaN, 3]) # korrekte Sortierung mit standard lt=isless
5-element Vector{Float64}:
1.0
2.0
3.0
NaN
NaN
julia> sort([2, NaN, 1, NaN, 3], lt=<) # falsche Sortierung aufgrund ungültigem lt. Dieses Verhalten ist undefiniert.
5-element Vector{Float64}:
2.0
NaN
1.0
NaN
3.0
sort!(A; dims::Integer, alg::Algorithm=defalg(A), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Sortiere das mehrdimensionale Array A
entlang der Dimension dims
. Siehe die eindimensionale Version von sort!
für eine Beschreibung der möglichen Schlüsselwortargumente.
Um Teile eines Arrays zu sortieren, verweisen Sie auf sortslices
.
Diese Funktion erfordert mindestens Julia 1.1.
Beispiele
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
— Functionsort(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Variante von sort!
, die eine sortierte Kopie von v
zurückgibt, wobei v
selbst unverändert bleibt.
Beispiele
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=defalg(A), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Sortiere ein mehrdimensionales Array A
entlang der angegebenen Dimension. Siehe sort!
für eine Beschreibung der möglichen Schlüsselwortargumente.
Um Teile eines Arrays zu sortieren, siehe sortslices
.
Beispiele
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
— Functionsortperm(A; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward, [dims::Integer])
Gibt einen Permutationsvektor oder -array I
zurück, der A[I]
in sortierter Reihenfolge entlang der angegebenen Dimension anordnet. Wenn A
mehr als eine Dimension hat, muss das Schlüsselwortargument dims
angegeben werden. Die Reihenfolge wird mit denselben Schlüsselwörtern wie bei sort!
angegeben. Die Permutation ist garantiert stabil, auch wenn der Sortieralgorithmus instabil ist: die Indizes von gleichen Elementen erscheinen in aufsteigender Reihenfolge.
Siehe auch sortperm!
, partialsortperm
, invperm
, indexin
. Um Teile eines Arrays zu sortieren, verweisen Sie auf sortslices
.
Die Methode, die dims
akzeptiert, erfordert mindestens Julia 1.9.
Beispiele
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 4
Base.Sort.InsertionSort
— ConstantInsertionSort
Verwenden Sie den Insertion-Sort-Algorithmus.
Insertion Sort durchläuft die Sammlung Element für Element und fügt jedes Element an seiner richtigen, sortierten Position im Ausgabvektor ein.
Merkmale:
- stabil: bewahrt die Reihenfolge der Elemente, die gleich sind
(z. B. "a" und "A" in einer Sortierung von Buchstaben, die die Groß- und Kleinschreibung ignoriert).
- in-place im Speicher.
- quadratische Leistung in der Anzahl der zu sortierenden Elemente:
es eignet sich gut für kleine Sammlungen, sollte jedoch nicht für große verwendet werden.
Base.Sort.MergeSort
— ConstantMergeSort
Geben Sie an, dass eine Sortierfunktion den Merge-Sort-Algorithmus verwenden sollte. Merge-Sort teilt die Sammlung in Unterkollektionen und kombiniert sie wiederholt, wobei jede Unterkollektion bei jedem Schritt sortiert wird, bis die gesamte Sammlung in sortierter Form wieder zusammengeführt wurde.
Merkmale:
- stabil: bewahrt die Reihenfolge von Elementen, die gleich sind (z. B. "a" und "A" in einer Sortierung von Buchstaben, die die Groß- und Kleinschreibung ignoriert).
- nicht in-place im Speicher.
- Teilen-und-Herrschen-Sortierstrategie.
- gute Leistung bei großen Sammlungen, aber typischerweise nicht ganz so schnell wie
QuickSort
.
Base.Sort.QuickSort
— ConstantSchnellSort
Geben Sie an, dass eine Sortierfunktion den Quick-Sort-Algorithmus verwenden sollte, der nicht stabil ist.
Merkmale:
- nicht stabil: bewahrt nicht die Reihenfolge von Elementen, die gleich sind (z. B. "a" und "A" in einer Sortierung von Buchstaben, die die Groß- und Kleinschreibung ignoriert).
- in-place im Speicher.
- teilen und erobern: Sortierstrategie ähnlich wie
MergeSort
. - gute Leistung für große Sammlungen.
Base.Sort.PartialQuickSort
— TypePartialQuickSort{T <: Union{Integer,OrdinalRange}}
Geben Sie an, dass eine Sortierfunktion den Algorithmus der partiellen schnellen Sortierung verwenden sollte. PartialQuickSort(k)
ist wie QuickSort
, muss jedoch nur die Elemente finden und sortieren, die in v[k]
landen würden, wenn v
vollständig sortiert wäre.
Eigenschaften:
- nicht stabil: bewahrt nicht die Reihenfolge von Elementen, die gleich sind (z. B. "a" und "A" in einer Sortierung von Buchstaben, die die Groß- und Kleinschreibung ignoriert).
- in-place im Speicher.
- teilen und erobern: Sortierstrategie ähnlich wie
MergeSort
.
Beachten Sie, dass PartialQuickSort(k)
nicht unbedingt das gesamte Array sortiert. Zum Beispiel,
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]
true
Base.Sort.sortperm!
— Functionsortperm!(ix, A; alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward, [dims::Integer])
Wie sortperm
, aber akzeptiert einen vorab zugewiesenen Indexvektor oder -array ix
mit denselben axes
wie A
. ix
wird initialisiert, um die Werte LinearIndices(A)
zu enthalten.
Das Verhalten kann unerwartet sein, wenn ein mutierter Parameter Speicher mit einem anderen Parameter teilt.
Die Methode, die dims
akzeptiert, erfordert mindestens Julia 1.9.
Beispiele
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 4
Base.sortslices
— Functionsortslices(A; dims, alg::Algorithm=DEFAULT_UNSTABLE, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Sortiere Scheiben eines Arrays A
. Das erforderliche Schlüsselwortargument dims
muss entweder eine ganze Zahl oder ein Tupel von ganzen Zahlen sein. Es gibt die Dimension(en) an, über die die Scheiben sortiert werden.
Zum Beispiel, wenn A
eine Matrix ist, wird dims=1
die Zeilen sortieren, dims=2
wird die Spalten sortieren. Beachte, dass die Standardvergleichsfunktion für eindimensionale Scheiben lexikographisch sortiert.
Für die verbleibenden Schlüsselwortargumente siehe die Dokumentation von sort!
.
Beispiele
julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1) # Zeilen sortieren
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) # Spalten sortieren
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
Höhere Dimensionen
sortslices
erweitert sich natürlich auf höhere Dimensionen. Zum Beispiel, wenn A
ein 2x2x2 Array ist, wird sortslices(A, dims=3)
die Scheiben innerhalb der 3. Dimension sortieren, indem die 2x2 Scheiben A[:, :, 1]
und A[:, :, 2]
an die Vergleichsfunktion übergeben werden. Beachte, dass es für höherdimensionale Scheiben keine Standardreihenfolge gibt, du kannst jedoch das Schlüsselwortargument by
oder lt
verwenden, um eine solche Reihenfolge anzugeben.
Wenn dims
ein Tupel ist, ist die Reihenfolge der Dimensionen in dims
relevant und gibt die lineare Reihenfolge der Scheiben an. Zum Beispiel, wenn A
dreidimensional ist und dims
(1, 2)
ist, werden die Anordnungen der ersten beiden Dimensionen so umgeordnet, dass die Scheiben (der verbleibenden dritten Dimension) sortiert werden. Wenn dims
stattdessen (2, 1)
ist, werden die gleichen Scheiben genommen, aber die Ergebnisreihenfolge wird zeilenweise sein.
Beispiele für höhere Dimensionen
julia> A = [4 3; 2 1 ;;; 'A' 'B'; 'C' 'D']
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
Order-Related Functions
Base.issorted
— Functionissorted(v, lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Überprüfen, ob eine Sammlung in sortierter Reihenfolge ist. Die Schlüsselwörter ändern, welche Reihenfolge als sortiert betrachtet wird, wie in der sort!
Dokumentation beschrieben.
Beispiele
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)
true
Base.Sort.searchsorted
— Functionsearchsorted(v, x; by=identity, lt=isless, rev=false)
Gibt den Bereich der Indizes in v
zurück, in dem die Werte gleich x
sind, oder einen leeren Bereich, der am Einfügepunkt liegt, wenn v
keine Werte enthält, die gleich x
sind. Der Vektor v
muss gemäß der durch die Schlüsselwörter definierten Reihenfolge sortiert sein. Siehe sort!
für die Bedeutung der Schlüsselwörter und die Definition von Äquivalenz. Beachten Sie, dass die by
-Funktion sowohl auf den gesuchten Wert x
als auch auf die Werte in v
angewendet wird.
Der Bereich wird im Allgemeinen mit einer binären Suche gefunden, es gibt jedoch optimierte Implementierungen für einige Eingaben.
Siehe auch: searchsortedfirst
, sort!
, insorted
, findall
.
Beispiele
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # einzelnes Match
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # mehrere Matches
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # kein Match, in der Mitte einfügen
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # kein Match, am Ende einfügen
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # kein Match, am Anfang einfügen
1:0
julia> searchsorted([1=>"one", 2=>"two", 2=>"two", 4=>"four"], 2=>"two", by=first) # vergleiche die Schlüssel der Paare
2:3
Base.Sort.searchsortedfirst
— Functionsearchsortedfirst(v, x; by=identity, lt=isless, rev=false)
Gibt den Index des ersten Wertes in v
zurück, der nicht vor x
geordnet ist. Wenn alle Werte in v
vor x
geordnet sind, wird lastindex(v) + 1
zurückgegeben.
Der Vektor v
muss gemäß der durch die Schlüsselwörter definierten Reihenfolge sortiert sein. Das Einfügen von x
an dem zurückgegebenen Index wird die sortierte Reihenfolge beibehalten. Siehe sort!
für die Bedeutung und Verwendung der Schlüsselwörter. Beachten Sie, dass die by
-Funktion sowohl auf den gesuchten Wert x
als auch auf die Werte in v
angewendet wird.
Der Index wird normalerweise mit einer binären Suche gefunden, es gibt jedoch optimierte Implementierungen für einige Eingaben.
Siehe auch: searchsortedlast
, searchsorted
, findfirst
.
Beispiele
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 4) # einzelnes Match
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 5) # mehrere Matches
4
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 3) # kein Match, in der Mitte einfügen
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 9) # kein Match, am Ende einfügen
7
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 0) # kein Match, am Anfang einfügen
1
julia> searchsortedfirst([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # vergleiche die Schlüssel der Paare
3
Base.Sort.searchsortedlast
— Functionsearchsortedlast(v, x; by=identity, lt=isless, rev=false)
Gibt den Index des letzten Wertes in v
zurück, der nicht nach x
geordnet ist. Wenn alle Werte in v
nach x
geordnet sind, wird firstindex(v) - 1
zurückgegeben.
Der Vektor v
muss gemäß der durch die Schlüsselwörter definierten Reihenfolge sortiert sein. Das insert!
von x
unmittelbar nach dem zurückgegebenen Index wird die sortierte Reihenfolge beibehalten. Siehe sort!
für die Bedeutung und Verwendung der Schlüsselwörter. Beachten Sie, dass die by
-Funktion sowohl auf den gesuchten Wert x
als auch auf die Werte in v
angewendet wird.
Der Index wird im Allgemeinen mit einer binären Suche gefunden, es gibt jedoch optimierte Implementierungen für einige Eingaben.
Beispiele
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 4) # einzelnes Match
3
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 5) # mehrere Matches
5
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 3) # kein Match, in der Mitte einfügen
2
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 9) # kein Match, am Ende einfügen
6
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 0) # kein Match, am Anfang einfügen
0
julia> searchsortedlast([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # vergleiche die Schlüssel der Paare
2
Base.Sort.insorted
— Functioninsorted(x, v; by=identity, lt=isless, rev=false) -> Bool
Bestimmen Sie, ob ein Vektor v
einen Wert enthält, der x
entspricht. Der Vektor v
muss gemäß der durch die Schlüsselwörter definierten Reihenfolge sortiert sein. Siehe sort!
für die Bedeutung der Schlüsselwörter und die Definition von Äquivalenz. Beachten Sie, dass die by
-Funktion sowohl auf den gesuchten Wert x
als auch auf die Werte in v
angewendet wird.
Die Überprüfung erfolgt in der Regel mithilfe einer binären Suche, es gibt jedoch optimierte Implementierungen für einige Eingaben.
Siehe auch in
.
Beispiele
julia> insorted(4, [1, 2, 4, 5, 5, 7]) # einzelnes Vorkommen
true
julia> insorted(5, [1, 2, 4, 5, 5, 7]) # mehrere Vorkommen
true
julia> insorted(3, [1, 2, 4, 5, 5, 7]) # kein Vorkommen
false
julia> insorted(9, [1, 2, 4, 5, 5, 7]) # kein Vorkommen
false
julia> insorted(0, [1, 2, 4, 5, 5, 7]) # kein Vorkommen
false
julia> insorted(2=>"ZWEI", [1=>"eins", 2=>"zwei", 4=>"vier"], by=first) # vergleichen Sie die Schlüssel der Paare
true
insorted
wurde in Julia 1.6 hinzugefügt.
Base.Sort.partialsort!
— Functionpartialsort!(v, k; by=identity, lt=isless, rev=false)
Sortiere den Vektor v
teilweise in-place, sodass der Wert am Index k
(oder der Bereich benachbarter Werte, wenn k
ein Bereich ist) an der Position erscheint, an der er erscheinen würde, wenn das Array vollständig sortiert wäre. Wenn k
ein einzelner Index ist, wird dieser Wert zurückgegeben; wenn k
ein Bereich ist, wird ein Array von Werten an diesen Indizes zurückgegeben. Beachte, dass partialsort!
das Eingangsarray möglicherweise nicht vollständig sortiert.
Für die Schlüsselwortargumente siehe die Dokumentation von sort!
.
Beispiele
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
— Functionpartialsort(v, k, by=identity, lt=isless, rev=false)
Variante von partialsort!
, die v
kopiert, bevor sie es teilweise sortiert, und somit dasselbe zurückgibt wie partialsort!
, aber v
unverändert lässt.
Base.Sort.partialsortperm
— Functionpartialsortperm(v, k; by=identity, lt=isless, rev=false)
Gibt eine partielle Permutation I
des Vektors v
zurück, sodass v[I]
Werte einer vollständig sortierten Version von v
an Index k
zurückgibt. Wenn k
ein Bereich ist, wird ein Vektor von Indizes zurückgegeben; wenn k
eine ganze Zahl ist, wird ein einzelner Index zurückgegeben. Die Reihenfolge wird mit denselben Schlüsselwörtern wie sort!
angegeben. Die Permutation ist stabil: die Indizes gleichwertiger Elemente erscheinen in aufsteigender Reihenfolge.
Diese Funktion ist äquivalent zu, aber effizienter als, sortperm(...)[k]
aufzurufen.
Beispiele
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!
— Functionpartialsortperm!(ix, v, k; by=identity, lt=isless, rev=false)
Wie partialsortperm
, aber akzeptiert einen vorab zugewiesenen Indexvektor ix
, der die gleiche Größe wie v
hat und verwendet wird, um (eine Permutation von) den Indizes von v
zu speichern.
ix
wird initialisiert, um die Indizes von v
zu enthalten.
(Typischerweise werden die Indizes von v
1:length(v)
sein, obwohl, wenn v
einen alternativen Array-Typ mit nicht-einsbasierten Indizes hat, wie z.B. ein OffsetArray
, ix
diese gleichen Indizes teilen muss)
Bei der Rückkehr ist garantiert, dass ix
die Indizes k
in ihren sortierten Positionen hat, sodass
partialsortperm!(ix, v, k);
v[ix[k]] == partialsort(v, k)
Der Rückgabewert ist das k
-te Element von ix
, wenn k
eine Ganzzahl ist, oder eine Ansicht in ix
, wenn k
ein Bereich ist.
Das Verhalten kann unerwartet sein, wenn ein mutierter Parameter Speicher mit einem anderen Parameter teilt.
Beispiele
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
```
Sorting Algorithms
Derzeit sind vier Sortieralgorithmen öffentlich in der Basis-Julia verfügbar:
Standardmäßig verwendet die sort
-Familie von Funktionen stabile Sortieralgorithmen, die bei den meisten Eingaben schnell sind. Die genaue Wahl des Algorithmus ist ein Implementierungsdetail, um zukünftige Leistungsverbesserungen zu ermöglichen. Derzeit wird ein Hybrid aus RadixSort
, ScratchQuickSort
, InsertionSort
und CountingSort
basierend auf Eingabetyp, Größe und Zusammensetzung verwendet. Implementierungsdetails können sich ändern, sind aber derzeit in der erweiterten Hilfe von ??Base.DEFAULT_STABLE
und den Docstrings der dort aufgeführten internen Sortieralgorithmen verfügbar.
Sie können Ihren bevorzugten Algorithmus explizit mit dem alg
-Schlüsselwort angeben (z. B. sort!(v, alg=PartialQuickSort(10:20))
) oder den Standard-Sortieralgorithmus für benutzerdefinierte Typen neu konfigurieren, indem Sie eine spezialisierte Methode zur Funktion Base.Sort.defalg
hinzufügen. Zum Beispiel definiert InlineStrings.jl die folgende Methode:
Base.Sort.defalg(::AbstractArray{<:Union{SmallInlineStrings, Missing}}) = InlineStringSort
Der Standard-Sortieralgorithmus (zurückgegeben von Base.Sort.defalg
) ist seit Julia 1.9 garantiert stabil. Frühere Versionen hatten instabile Randfälle beim Sortieren von numerischen Arrays.
Alternate Orderings
Standardmäßig verwenden sort
, searchsorted
und verwandte Funktionen isless
, um zwei Elemente zu vergleichen und zu bestimmen, welches zuerst kommen sollte. Der Base.Order.Ordering
abstrakte Typ bietet einen Mechanismus zur Definition alternativer Sortierungen für dasselbe Set von Elementen: Beim Aufrufen einer Sortierfunktion wie sort!
kann eine Instanz von Ordering
mit dem Schlüsselwortargument order
bereitgestellt werden.
Instanzen von Ordering
definieren eine Ordnung durch die Base.Order.lt
-Funktion, die als Verallgemeinerung von isless
fungiert. Das Verhalten dieser Funktion bei benutzerdefinierten Ordering
s muss alle Bedingungen eines strict weak order erfüllen. Siehe sort!
für Details und Beispiele gültiger und ungültiger lt
-Funktionen.
Base.Order.Ordering
— TypeBase.Order.Ordering
Abstrakte Typ, der eine strikte schwache Ordnung auf einer Menge von Elementen darstellt. Siehe sort!
für weitere Informationen.
Verwenden Sie Base.Order.lt
, um zwei Elemente gemäß der Ordnung zu vergleichen.
Base.Order.lt
— Functionlt(o::Ordering, a, b) -> Bool
Überprüfen, ob a
kleiner als b
ist gemäß der Ordnung o
.
Base.Order.ord
— Functionord(lt, by, rev::Union{Bool, Nothing}, order::Ordering=Forward)
Konstruiere ein Ordering
Objekt aus denselben Argumenten, die von sort!
verwendet werden. Elemente werden zuerst durch die Funktion by
transformiert (die möglicherweise identity
ist) und dann gemäß der Funktion lt
oder einer bestehenden Ordnung order
verglichen. lt
sollte isless
oder eine Funktion sein, die denselben Regeln wie der lt
Parameter von sort!
gehorcht. Schließlich wird die resultierende Ordnung umgekehrt, wenn rev=true
.
Es ist nicht erlaubt, ein lt
zu übergeben, das nicht isless
ist, zusammen mit einer order
, die nicht Base.Order.Forward
oder Base.Order.Reverse
ist; andernfalls sind alle Optionen unabhängig und können in allen möglichen Kombinationen zusammen verwendet werden.
Base.Order.Forward
— ConstantBase.Order.Forward
Standardreihenfolge gemäß isless
.
Base.Order.ReverseOrdering
— TypeReverseOrdering(fwd::Ordering=Forward)
Ein Wrapper, der eine Reihenfolge umkehrt.
Für eine gegebene Ordering
o
gilt Folgendes für alle a
, b
:
lt(ReverseOrdering(o), a, b) == lt(o, b, a)
Base.Order.Reverse
— ConstantBase.Order.Reverse
Umgekehrte Sortierung gemäß isless
.
Base.Order.By
— TypeBy(by, order::Ordering=Vorwärts)
Ordering
, das order
auf Elemente anwendet, nachdem sie durch die Funktion by
transformiert wurden.
Base.Order.Lt
— TypeLt(lt)
Ordering
, das lt(a, b)
aufruft, um Elemente zu vergleichen. lt
muss die gleichen Regeln befolgen wie der lt
-Parameter von sort!
.
Base.Order.Perm
— TypePerm(order::Ordering, data::AbstractVector)
Ordering
auf den Indizes von data
, wobei i
kleiner als j
ist, wenn data[i]
kleiner als data[j]
gemäß order
ist. Im Fall, dass data[i]
und data[j]
gleich sind, werden i
und j
nach ihrem numerischen Wert verglichen.