Sorting and Related Functions
Julia dispose d'une API étendue et flexible pour trier et interagir avec des tableaux de valeurs déjà triés. Par défaut, Julia choisit des algorithmes raisonnables et trie par ordre croissant :
julia> sort([2,3,1])
3-element Vector{Int64}:
1
2
3
Vous pouvez trier dans l'ordre inverse également :
julia> sort([2,3,1], rev=true)
3-element Vector{Int64}:
3
2
1
sort
construit une copie triée sans modifier son entrée. Utilisez la version "bang" de la fonction de tri pour muter un tableau existant :
julia> a = [2,3,1];
julia> sort!(a);
julia> a
3-element Vector{Int64}:
1
2
3
Au lieu de trier directement un tableau, vous pouvez calculer une permutation des indices du tableau qui met le tableau dans l'ordre trié :
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
Les tableaux peuvent être triés selon une transformation arbitraire de leurs valeurs :
julia> sort(v, by=abs)
5-element Array{Float64,1}:
-0.0104452
0.297288
0.382396
-0.597634
-0.839027
Ou dans l'ordre inverse par une transformation :
julia> sort(v, by=abs, rev=true)
5-element Array{Float64,1}:
-0.839027
-0.597634
0.382396
0.297288
-0.0104452
Si nécessaire, l'algorithme de tri peut être choisi :
julia> sort(v, alg=InsertionSort)
5-element Array{Float64,1}:
-0.839027
-0.597634
-0.0104452
0.297288
0.382396
Toutes les fonctions liées au tri et à l'ordre reposent sur une relation "inférieure à" définissant un strict weak order sur les valeurs à manipuler. La fonction isless
est invoquée par défaut, mais la relation peut être spécifiée via le mot-clé lt
, une fonction qui prend deux éléments de tableau et retourne true
si et seulement si le premier argument est "inférieur à" le second. Voir sort!
et Alternate Orderings pour plus d'informations.
Sorting Functions
Base.sort!
— Functionsort!(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)
Trie le vecteur v
sur place. Un algorithme stable est utilisé par défaut : l'ordre des éléments qui se comparent comme égaux est préservé. Un algorithme spécifique peut être sélectionné via le mot-clé alg
(voir Algorithmes de tri pour les algorithmes disponibles).
Les éléments sont d'abord transformés avec la fonction by
puis comparés selon la fonction lt
ou l'ordre order
. Enfin, l'ordre résultant est inversé si rev=true
(cela préserve la stabilité en avant : les éléments qui se comparent comme égaux ne sont pas inversés). L'implémentation actuelle applique la transformation by
avant chaque comparaison plutôt qu'une fois par élément.
Passer un lt
autre que isless
avec un order
autre que Base.Order.Forward
ou Base.Order.Reverse
n'est pas permis, sinon toutes les options sont indépendantes et peuvent être utilisées ensemble dans toutes les combinaisons possibles. Notez que order
peut également inclure une transformation "by", auquel cas elle est appliquée après celle définie avec le mot-clé by
. Pour plus d'informations sur les valeurs order
, voir la documentation sur Ordres alternatifs.
Les relations entre deux éléments sont définies comme suit (avec "moins" et "plus" échangés lorsque rev=true
) :
x
est inférieur ày
silt(by(x), by(y))
(ouBase.Order.lt(order, by(x), by(y))
) renvoie vrai.x
est supérieur ày
siy
est inférieur àx
.x
ety
sont équivalents si aucun n'est inférieur à l'autre ("incomparable" est parfois utilisé comme synonyme d'"équivalent").
Le résultat de sort!
est trié dans le sens où chaque élément est supérieur ou équivalent au précédent.
La fonction lt
doit définir un ordre faible strict, c'est-à-dire qu'elle doit être
- irréflexive :
lt(x, x)
renvoie toujoursfalse
, - asymétrique : si
lt(x, y)
renvoietrue
, alorslt(y, x)
renvoiefalse
, - transitive :
lt(x, y) && lt(y, z)
impliquelt(x, z)
, - transitive en équivalence :
!lt(x, y) && !lt(y, x)
et!lt(y, z) && !lt(z, y)
ensemble impliquent!lt(x, z) && !lt(z, x)
. En d'autres termes : six
ety
sont équivalents ety
etz
sont équivalents, alorsx
etz
doivent être équivalents.
Par exemple, <
est une fonction lt
valide pour les valeurs Int
, mais ≤
ne l'est pas : elle viole l'irréflexivité. Pour les valeurs Float64
, même <
est invalide car elle viole la quatrième condition : 1.0
et NaN
sont équivalents et il en va de même pour NaN
et 2.0
, mais 1.0
et 2.0
ne sont pas équivalents.
Voir aussi sort
, sortperm
, sortslices
, partialsort!
, partialsortperm
, issorted
, searchsorted
, insorted
, Base.Order.ord
.
Exemples
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)) # même que sort(0:3, by=abs(x->x-2))
4-element Vector{Int64}:
2
1
3
0
julia> sort([2, NaN, 1, NaN, 3]) # tri correct avec lt par défaut=isless
5-element Vector{Float64}:
1.0
2.0
3.0
NaN
NaN
julia> sort([2, NaN, 1, NaN, 3], lt=<) # tri incorrect en raison d'un lt invalide. Ce comportement est indéfini.
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)
Trie le tableau multidimensionnel A
le long de la dimension dims
. Voir la version unidimensionnelle de sort!
pour une description des arguments de mot-clé possibles.
Pour trier des tranches d'un tableau, référez-vous à sortslices
.
Cette fonction nécessite au moins Julia 1.1.
Exemples
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 de sort!
qui renvoie une copie triée de v
laissant v
lui-même non modifié.
Exemples
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)
Trie un tableau multidimensionnel A
le long de la dimension donnée. Voir sort!
pour une description des arguments de mot-clé possibles.
Pour trier des tranches d'un tableau, référez-vous à sortslices
.
Exemples
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])
Retourne un vecteur ou tableau de permutation I
qui place A[I]
dans l'ordre trié selon la dimension donnée. Si A
a plus d'une dimension, alors l'argument clé dims
doit être spécifié. L'ordre est spécifié en utilisant les mêmes mots-clés que sort!
. La permutation est garantie d'être stable même si l'algorithme de tri est instable : les indices des éléments égaux apparaîtront dans l'ordre croissant.
Voir aussi sortperm!
, partialsortperm
, invperm
, indexin
. Pour trier des tranches d'un tableau, référez-vous à sortslices
.
La méthode acceptant dims
nécessite au moins Julia 1.9.
Exemples
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
— ConstantTri par insertion
Utilisez l'algorithme de tri par insertion.
Le tri par insertion parcourt la collection un élément à la fois, insérant chaque élément à sa position correcte et triée dans le vecteur de sortie.
Caractéristiques :
- stable : préserve l'ordre des éléments qui se comparent comme égaux
(par exemple "a" et "A" dans un tri de lettres qui ignore la casse).
- en place en mémoire.
- performance quadratique en fonction du nombre d'éléments à trier :
il est bien adapté aux petites collections mais ne doit pas être utilisé pour de grandes.
Base.Sort.MergeSort
— ConstantTriFusion
Indiquez qu'une fonction de tri doit utiliser l'algorithme de tri fusion. Le tri fusion divise la collection en sous-collections et les fusionne de manière répétée, triant chaque sous-collection à chaque étape, jusqu'à ce que l'ensemble de la collection ait été recombiné sous forme triée.
Caractéristiques :
- stable : préserve l'ordre des éléments qui se comparent comme égaux (par exemple, "a" et "A" dans un tri de lettres qui ignore la casse).
- pas en place en mémoire.
- stratégie de tri diviser et conquérir.
- bonne performance pour de grandes collections mais généralement pas aussi rapide que
QuickSort
.
Base.Sort.QuickSort
— ConstantQuickSort
Indiquez qu'une fonction de tri doit utiliser l'algorithme de tri rapide, qui n'est pas stable.
Caractéristiques :
- pas stable : ne préserve pas l'ordre des éléments qui se comparent comme égaux (par exemple "a" et "A" dans un tri de lettres qui ignore la casse).
- en place en mémoire.
- diviser pour régner : stratégie de tri similaire à
MergeSort
. - bonne performance pour de grandes collections.
Base.Sort.PartialQuickSort
— TypePartialQuickSort{T <: Union{Integer,OrdinalRange}}
Indiquez qu'une fonction de tri doit utiliser l'algorithme de tri rapide partiel. PartialQuickSort(k)
est semblable à QuickSort
, mais n'est requis que pour trouver et trier les éléments qui se retrouveraient dans v[k]
si v
était entièrement trié.
Caractéristiques :
- non stable : ne préserve pas l'ordre des éléments qui se comparent comme égaux (par exemple, "a" et "A" dans un tri de lettres qui ignore la casse).
- en place en mémoire.
- diviser pour régner : stratégie de tri similaire à
MergeSort
.
Notez que PartialQuickSort(k)
ne trie pas nécessairement l'ensemble du tableau. Par exemple,
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])
Comme sortperm
, mais accepte un vecteur ou tableau d'index préalloué ix
avec les mêmes axes
que A
. ix
est initialisé pour contenir les valeurs LinearIndices(A)
.
Le comportement peut être inattendu lorsque tout argument muté partage de la mémoire avec un autre argument.
La méthode acceptant dims
nécessite au moins Julia 1.9.
Exemples
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)
Trie les tranches d'un tableau A
. L'argument clé requis dims
doit être soit un entier, soit un tuple d'entiers. Il spécifie la ou les dimensions sur lesquelles les tranches sont triées.
Par exemple, si A
est une matrice, dims=1
triera les lignes, dims=2
triera les colonnes. Notez que la fonction de comparaison par défaut sur les tranches unidimensionnelles trie de manière lexicographique.
Pour les autres arguments clés, voir la documentation de sort!
.
Exemples
julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1) # Trier les lignes
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) # Trier les colonnes
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
Dimensions supérieures
sortslices
s'étend naturellement aux dimensions supérieures. Par exemple, si A
est un tableau 2x2x2, sortslices(A, dims=3)
triera les tranches dans la 3ème dimension, passant les tranches 2x2 A[:, :, 1]
et A[:, :, 2]
à la fonction de comparaison. Notez que bien qu'il n'y ait pas d'ordre par défaut sur les tranches de dimensions supérieures, vous pouvez utiliser l'argument clé by
ou lt
pour spécifier un tel ordre.
Si dims
est un tuple, l'ordre des dimensions dans dims
est pertinent et spécifie l'ordre linéaire des tranches. Par exemple, si A
est tridimensionnel et que dims
est (1, 2)
, les ordres des deux premières dimensions sont réarrangés de sorte que les tranches (de la troisième dimension restante) soient triées. Si dims
est (2, 1)
à la place, les mêmes tranches seront prises, mais l'ordre du résultat sera de type "row-major".
Exemples de dimensions supérieures
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)
Testez si une collection est triée. Les mots-clés modifient quel ordre est considéré comme trié, comme décrit dans la documentation de sort!
.
Exemples
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)
Renvoie la plage d'indices dans v
où les valeurs sont équivalentes à x
, ou une plage vide située au point d'insertion si v
ne contient pas de valeurs équivalentes à x
. Le vecteur v
doit être trié selon l'ordre défini par les mots-clés. Consultez sort!
pour la signification des mots-clés et la définition de l'équivalence. Notez que la fonction by
est appliquée à la valeur recherchée x
ainsi qu'aux valeurs dans v
.
La plage est généralement trouvée en utilisant une recherche binaire, mais il existe des implémentations optimisées pour certaines entrées.
Voir aussi : searchsortedfirst
, sort!
, insorted
, findall
.
Exemples
julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # correspondance unique
3:3
julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # correspondances multiples
4:5
julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # pas de correspondance, insérer au milieu
3:2
julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # pas de correspondance, insérer à la fin
7:6
julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # pas de correspondance, insérer au début
1:0
julia> searchsorted([1=>"one", 2=>"two", 2=>"two", 4=>"four"], 2=>"two", by=first) # comparer les clés des paires
2:3
Base.Sort.searchsortedfirst
— Functionsearchsortedfirst(v, x; by=identity, lt=isless, rev=false)
Retourne l'index de la première valeur dans v
qui n'est pas ordonnée avant x
. Si toutes les valeurs dans v
sont ordonnées avant x
, retourne lastindex(v) + 1
.
Le vecteur v
doit être trié selon l'ordre défini par les mots-clés. insert!
ing x
à l'index retourné maintiendra l'ordre trié. Référez-vous à sort!
pour la signification et l'utilisation des mots-clés. Notez que la fonction by
est appliquée à la valeur recherchée x
ainsi qu'aux valeurs dans v
.
L'index est généralement trouvé en utilisant une recherche binaire, mais il existe des implémentations optimisées pour certaines entrées.
Voir aussi : searchsortedlast
, searchsorted
, findfirst
.
Exemples
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 4) # correspondance unique
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 5) # correspondances multiples
4
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 3) # pas de correspondance, insérer au milieu
3
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 9) # pas de correspondance, insérer à la fin
7
julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 0) # pas de correspondance, insérer au début
1
julia> searchsortedfirst([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # comparer les clés des paires
3
Base.Sort.searchsortedlast
— Functionsearchsortedlast(v, x; by=identity, lt=isless, rev=false)
Retourne l'index de la dernière valeur dans v
qui n'est pas ordonnée après x
. Si toutes les valeurs dans v
sont ordonnées après x
, retourne firstindex(v) - 1
.
Le vecteur v
doit être trié selon l'ordre défini par les mots-clés. L'insertion de x
immédiatement après l'index retourné maintiendra l'ordre trié. Référez-vous à sort!
pour la signification et l'utilisation des mots-clés. Notez que la fonction by
est appliquée à la valeur recherchée x
ainsi qu'aux valeurs dans v
.
L'index est généralement trouvé en utilisant une recherche binaire, mais il existe des implémentations optimisées pour certaines entrées.
Exemples
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 4) # correspondance unique
3
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 5) # correspondances multiples
5
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 3) # pas de correspondance, insérer au milieu
2
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 9) # pas de correspondance, insérer à la fin
6
julia> searchsortedlast([1, 2, 4, 5, 5, 7], 0) # pas de correspondance, insérer au début
0
julia> searchsortedlast([1=>"un", 2=>"deux", 4=>"quatre"], 3=>"trois", by=first) # comparer les clés des paires
2
Base.Sort.insorted
— Functioninsorted(x, v; by=identity, lt=isless, rev=false) -> Bool
Déterminez si un vecteur v
contient une valeur équivalente à x
. Le vecteur v
doit être trié selon l'ordre défini par les mots-clés. Référez-vous à sort!
pour la signification des mots-clés et la définition de l'équivalence. Notez que la fonction by
est appliquée à la valeur recherchée x
ainsi qu'aux valeurs dans v
.
La vérification est généralement effectuée à l'aide d'une recherche binaire, mais il existe des implémentations optimisées pour certaines entrées.
Voir aussi in
.
Exemples
julia> insorted(4, [1, 2, 4, 5, 5, 7]) # correspondance unique
true
julia> insorted(5, [1, 2, 4, 5, 5, 7]) # correspondances multiples
true
julia> insorted(3, [1, 2, 4, 5, 5, 7]) # pas de correspondance
false
julia> insorted(9, [1, 2, 4, 5, 5, 7]) # pas de correspondance
false
julia> insorted(0, [1, 2, 4, 5, 5, 7]) # pas de correspondance
false
julia> insorted(2=>"TWO", [1=>"one", 2=>"two", 4=>"four"], by=first) # comparer les clés des paires
true
insorted
a été ajouté dans Julia 1.6.
Base.Sort.partialsort!
— Functionpartialsort!(v, k; by=identity, lt=isless, rev=false)
Trie partiellement le vecteur v
sur place de sorte que la valeur à l'index k
(ou plage de valeurs adjacentes si k
est une plage) se trouve à la position où elle apparaîtrait si le tableau était entièrement trié. Si k
est un seul index, cette valeur est renvoyée ; si k
est une plage, un tableau de valeurs à ces indices est renvoyé. Notez que partialsort!
peut ne pas trier complètement le tableau d'entrée.
Pour les arguments de mot-clé, voir la documentation de sort!
.
Exemples
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 de partialsort!
qui copie v
avant de le trier partiellement, renvoyant ainsi la même chose que partialsort!
mais laissant v
non modifié.
Base.Sort.partialsortperm
— Functionpartialsortperm(v, k; by=identity, lt=isless, rev=false)
Renvoie une permutation partielle I
du vecteur v
, de sorte que v[I]
renvoie les valeurs d'une version entièrement triée de v
à l'index k
. Si k
est une plage, un vecteur d'indices est renvoyé ; si k
est un entier, un seul indice est renvoyé. L'ordre est spécifié en utilisant les mêmes mots-clés que sort!
. La permutation est stable : les indices des éléments égaux apparaîtront dans l'ordre croissant.
Cette fonction est équivalente à, mais plus efficace que, l'appel à sortperm(...)[k]
.
Exemples
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)
Comme partialsortperm
, mais accepte un vecteur d'index préalloué ix
de la même taille que v
, qui est utilisé pour stocker (une permutation de) les indices de v
.
ix
est initialisé pour contenir les indices de v
.
(En général, les indices de v
seront 1:length(v)
, bien que si v
a un type de tableau alternatif avec des indices non basés sur un, comme un OffsetArray
, ix
doit partager ces mêmes indices)
Au retour, ix
est garanti d'avoir les indices k
dans leurs positions triées, de sorte que
partialsortperm!(ix, v, k);
v[ix[k]] == partialsort(v, k)
La valeur de retour est le k
-ème élément de ix
si k
est un entier, ou une vue dans ix
si k
est une plage.
Le comportement peut être inattendu lorsque tout argument muté partage de la mémoire avec un autre argument.
Exemples
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
Il existe actuellement quatre algorithmes de tri disponibles publiquement dans Julia de base :
Par défaut, la famille de fonctions sort
utilise des algorithmes de tri stables qui sont rapides sur la plupart des entrées. Le choix exact de l'algorithme est un détail d'implémentation pour permettre de futures améliorations de performance. Actuellement, un hybride de RadixSort
, ScratchQuickSort
, InsertionSort
et CountingSort
est utilisé en fonction du type, de la taille et de la composition des entrées. Les détails d'implémentation sont susceptibles de changer mais sont actuellement disponibles dans l'aide étendue de ??Base.DEFAULT_STABLE
et les docstrings des algorithmes de tri internes qui y sont listés.
Vous pouvez spécifier explicitement votre algorithme préféré avec le mot-clé alg
(par exemple, sort!(v, alg=PartialQuickSort(10:20))
) ou reconfigurer l'algorithme de tri par défaut pour les types personnalisés en ajoutant une méthode spécialisée à la fonction Base.Sort.defalg
. Par exemple, InlineStrings.jl définit la méthode suivante :
Base.Sort.defalg(::AbstractArray{<:Union{SmallInlineStrings, Missing}}) = InlineStringSort
L'algorithme de tri par défaut (retourné par Base.Sort.defalg
) est garanti d'être stable depuis Julia 1.9. Les versions précédentes avaient des cas limites instables lors du tri des tableaux numériques.
Alternate Orderings
Par défaut, sort
, searchsorted
et les fonctions connexes utilisent isless
pour comparer deux éléments afin de déterminer lequel doit venir en premier. Le type abstrait Base.Order.Ordering
fournit un mécanisme pour définir des ordres alternatifs sur le même ensemble d'éléments : lors de l'appel d'une fonction de tri comme sort!
, une instance de Ordering
peut être fournie avec l'argument clé order
.
Les instances de Ordering
définissent un ordre à travers la fonction Base.Order.lt
, qui fonctionne comme une généralisation de isless
. Le comportement de cette fonction sur des Ordering
s personnalisés doit satisfaire toutes les conditions d'un strict weak order. Voir sort!
pour des détails et des exemples de fonctions lt
valides et invalides.
Base.Order.Ordering
— TypeBase.Order.Ordering
Type abstrait qui représente un ordre faible strict sur un ensemble d'éléments. Voir sort!
pour plus d'informations.
Utilisez Base.Order.lt
pour comparer deux éléments selon l'ordre.
Base.Order.lt
— Functionlt(o::Ordering, a, b) -> Bool
Testez si a
est inférieur à b
selon l'ordre o
.
Base.Order.ord
— Functionord(lt, by, rev::Union{Bool, Nothing}, order::Ordering=Forward)
Construit un objet Ordering
à partir des mêmes arguments utilisés par sort!
. Les éléments sont d'abord transformés par la fonction by
(qui peut être identity
) et sont ensuite comparés selon la fonction lt
ou un ordre existant order
. lt
doit être isless
ou une fonction qui respecte les mêmes règles que le paramètre lt
de sort!
. Enfin, l'ordre résultant est inversé si rev=true
.
Passer un lt
autre que isless
avec un order
autre que Base.Order.Forward
ou Base.Order.Reverse
n'est pas permis, sinon toutes les options sont indépendantes et peuvent être utilisées ensemble dans toutes les combinaisons possibles.
Base.Order.Forward
— ConstantBase.Order.Forward
Ordre par défaut selon isless
.
Base.Order.ReverseOrdering
— TypeReverseOrdering(fwd::Ordering=Forward)
Un wrapper qui inverse un ordre.
Pour un Ordering
donné o
, ce qui suit est vrai pour tous les a
, b
:
lt(ReverseOrdering(o), a, b) == lt(o, b, a)
Base.Order.Reverse
— ConstantBase.Order.Reverse
Ordre inverse selon isless
.
Base.Order.By
— TypeBy(by, order::Ordering=Forward)
Ordering
qui applique order
aux éléments après qu'ils aient été transformés par la fonction by
.
Base.Order.Lt
— TypeLt(lt)
Ordering
qui appelle lt(a, b)
pour comparer les éléments. lt
doit respecter les mêmes règles que le paramètre lt
de sort!
.
Base.Order.Perm
— TypePerm(order::Ordering, data::AbstractVector)
Ordering
sur les indices de data
où i
est inférieur à j
si data[i]
est inférieur à data[j]
selon order
. Dans le cas où data[i]
et data[j]
sont égaux, i
et j
sont comparés par valeur numérique.