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!Function
sort!(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 als y, wenn lt(by(x), by(y)) (oder Base.Order.lt(order, by(x), by(y))) wahr ergibt.
  • x ist größer als y, wenn y kleiner als x ist.
  • x und y 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 immer false,
  • asymmetrisch sein: wenn lt(x, y) true ergibt, dann ergibt lt(y, x) false,
  • transitiv sein: lt(x, y) && lt(y, z) impliziert lt(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: wenn x und y äquivalent sind und y und z äquivalent sind, dann müssen x und z ä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
source
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.

Julia 1.1

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
source
Base.sortFunction
sort(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
source
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
source
Base.sortpermFunction
sortperm(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.

Julia 1.9

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
source
Base.Sort.InsertionSortConstant
InsertionSort

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.

source
Base.Sort.MergeSortConstant
MergeSort

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.
source
Base.Sort.QuickSortConstant
SchnellSort

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.
source
Base.Sort.PartialQuickSortType
PartialQuickSort{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
source
Base.Sort.sortperm!Function
sortperm!(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.

Warning

Das Verhalten kann unerwartet sein, wenn ein mutierter Parameter Speicher mit einem anderen Parameter teilt.

Julia 1.9

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
source
Base.sortslicesFunction
sortslices(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
source
Base.issortedFunction
issorted(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
source
Base.Sort.searchsortedFunction
searchsorted(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
source
Base.Sort.searchsortedfirstFunction
searchsortedfirst(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
source
Base.Sort.searchsortedlastFunction
searchsortedlast(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
source
Base.Sort.insortedFunction
insorted(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
Julia 1.6

insorted wurde in Julia 1.6 hinzugefügt.

source
Base.Sort.partialsort!Function
partialsort!(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
source
Base.Sort.partialsortFunction
partialsort(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.

source
Base.Sort.partialsortpermFunction
partialsortperm(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
source
Base.Sort.partialsortperm!Function
partialsortperm!(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.

Warning

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

```

source

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
Julia 1.9

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 Orderings 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.OrderingType
Base.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.

source
Base.Order.ltFunction
lt(o::Ordering, a, b) -> Bool

Überprüfen, ob a kleiner als b ist gemäß der Ordnung o.

source
Base.Order.ordFunction
ord(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.

source
Base.Order.ReverseOrderingType
ReverseOrdering(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)
source
Base.Order.ByType
By(by, order::Ordering=Vorwärts)

Ordering, das order auf Elemente anwendet, nachdem sie durch die Funktion by transformiert wurden.

source
Base.Order.LtType
Lt(lt)

Ordering, das lt(a, b) aufruft, um Elemente zu vergleichen. lt muss die gleichen Regeln befolgen wie der lt-Parameter von sort!.

source
Base.Order.PermType
Perm(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.

source