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!Function
sort!(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 si lt(by(x), by(y)) (ou Base.Order.lt(order, by(x), by(y))) renvoie vrai.
  • x est supérieur à y si y est inférieur à x.
  • x et y 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 toujours false,
  • asymétrique : si lt(x, y) renvoie true, alors lt(y, x) renvoie false,
  • transitive : lt(x, y) && lt(y, z) implique lt(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 : si x et y sont équivalents et y et z sont équivalents, alors x et z 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
source
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.

Julia 1.1

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

Julia 1.9

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

source
Base.Sort.MergeSortConstant
TriFusion

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

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

Avertissement

Le comportement peut être inattendu lorsque tout argument muté partage de la mémoire avec un autre argument.

Julia 1.9

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

insorted a été ajouté dans Julia 1.6.

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

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

Avertissement

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

```

source

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

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

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

Testez si a est inférieur à b selon l'ordre o.

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

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

Ordering qui applique order aux éléments après qu'ils aient été transformés par la fonction by.

source
Base.Order.LtType
Lt(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!.

source
Base.Order.PermType
Perm(order::Ordering, data::AbstractVector)

Ordering sur les indices de datai 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.

source