Sorting and Related Functions

Julia, sıralama ve zaten sıralanmış değer dizileriyle etkileşim kurma konusunda kapsamlı ve esnek bir API'ye sahiptir. Varsayılan olarak, Julia makul algoritmalar seçer ve artan sırada sıralar:

julia> sort([2,3,1])
3-element Vector{Int64}:
 1
 2
 3

Ters sıralama da yapabilirsiniz:

julia> sort([2,3,1], rev=true)
3-element Vector{Int64}:
 3
 2
 1

sort, girdi değişmeden sıralı bir kopya oluşturur. Mevcut bir diziyi değiştirmek için sıralama fonksiyonunun "bang" versiyonunu kullanın:

julia> a = [2,3,1];

julia> sort!(a);

julia> a
3-element Vector{Int64}:
 1
 2
 3

Diziyi doğrudan sıralamak yerine, dizinin sıralı hale gelmesini sağlayan dizinin indekslerinin bir permütasyonunu hesaplayabilirsiniz:

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

Diziler, değerlerinin keyfi bir dönüşümüne göre sıralanabilir:

julia> sort(v, by=abs)
5-element Array{Float64,1}:
 -0.0104452
  0.297288
  0.382396
 -0.597634
 -0.839027

Ya da bir dönüşümle ters sırayla:

julia> sort(v, by=abs, rev=true)
5-element Array{Float64,1}:
 -0.839027
 -0.597634
  0.382396
  0.297288
 -0.0104452

Gerekirse, sıralama algoritması seçilebilir:

julia> sort(v, alg=InsertionSort)
5-element Array{Float64,1}:
 -0.839027
 -0.597634
 -0.0104452
  0.297288
  0.382396

Tüm sıralama ve düzen ile ilgili işlevler, işlenmesi gereken değerler üzerinde bir strict weak order tanımlayan bir "küçüktür" ilişkisine dayanır. isless işlevi varsayılan olarak çağrılır, ancak ilişki lt anahtar kelimesi aracılığıyla belirtilebilir; bu, iki dizi elemanı alan ve yalnızca ilk argümanın ikinci argümandan "küçük" olması durumunda true döndüren bir işlevdir. Daha fazla bilgi için sort! ve Alternate Orderings'ya bakın.

Sorting Functions

Base.sort!Function
sort!(v; alg::Algorithm=defalg(v), lt=isless, by=identity, rev::Bool=false, order::Ordering=Forward)

Vektörü v yerinde sıralar. Varsayılan olarak kararlı bir algoritma kullanılır: eşit karşılaştırılan elemanların sıralaması korunur. Belirli bir algoritma alg anahtar kelimesi aracılığıyla seçilebilir (mevcut algoritmalar için Sıralama Algoritmaları bölümüne bakın).

Elemanlar önce by fonksiyonu ile dönüştürülür ve ardından ya lt fonksiyonu ya da order sıralamasına göre karşılaştırılır. Son olarak, sonuç sıralaması rev=true ise tersine çevrilir (bu, ileri stabiliteyi korur: eşit karşılaştırılan elemanlar tersine çevrilmez). Mevcut uygulama, her karşılaştırmadan önce by dönüşümünü uygular, her eleman için bir kez değil.

isless dışındaki bir lt fonksiyonu ile Base.Order.Forward veya Base.Order.Reverse dışındaki bir order kullanmak yasaktır, aksi takdirde tüm seçenekler bağımsızdır ve tüm olası kombinasyonlarda birlikte kullanılabilir. order ayrıca bir "by" dönüşümü de içerebilir; bu durumda, by anahtar kelimesi ile tanımlanan dönüşümden sonra uygulanır. order değerleri hakkında daha fazla bilgi için Alternatif Sıralamalar belgesine bakın.

İki eleman arasındaki ilişkiler aşağıdaki gibi tanımlanır (bu durumda "daha az" ve "daha fazla" rev=true olduğunda değiştirilir):

  • x, y'den daha azdır eğer lt(by(x), by(y)) (veya Base.Order.lt(order, by(x), by(y))) doğruysa.
  • x, y'den daha fazladır eğer y, x'den daha azdır.
  • x ve y eşdeğerdir eğer hiçbiri diğerinden daha az değildir ("karşılaştırılamaz" bazen "eşdeğer" için bir eşanlamlı olarak kullanılır).

sort! fonksiyonunun sonucu, her elemanın bir öncekinden daha büyük veya eşdeğer olduğu anlamında sıralıdır.

lt fonksiyonu katı bir zayıf sıralama tanımlamalıdır, yani:

  • irrefleksif olmalıdır: lt(x, x) her zaman false döner,
  • asimetrik olmalıdır: eğer lt(x, y) doğruysa, o zaman lt(y, x) yanlış olmalıdır,
  • geçişli olmalıdır: lt(x, y) && lt(y, z) ise lt(x, z)'yi gerektirir,
  • eşdeğerlikte geçişli olmalıdır: !lt(x, y) && !lt(y, x) ve !lt(y, z) && !lt(z, y) birlikte !lt(x, z) && !lt(z, x)'yi gerektirir. Kısacası: eğer x ve y eşdeğer ve y ve z eşdeğer ise, o zaman x ve z de eşdeğer olmalıdır.

Örneğin, < Int değerleri için geçerli bir lt fonksiyonudur, ancak değildir: irrefleksifliği ihlal eder. Float64 değerleri için, < bile geçerli değildir çünkü dördüncü koşulu ihlal eder: 1.0 ve NaN eşdeğerdir ve NaN ve 2.0 da öyle, ancak 1.0 ve 2.0 eşdeğer değildir.

Ayrıca sort, sortperm, sortslices, partialsort!, partialsortperm, issorted, searchsorted, insorted, Base.Order.ord belgelerine de bakın.

Örnekler

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)) # same as sort(0:3, by=abs(x->x-2))
4-element Vector{Int64}:
 2
 1
 3
 0

julia> sort([2, NaN, 1, NaN, 3]) # correct sort with default lt=isless
5-element Vector{Float64}:
   1.0
   2.0
   3.0
 NaN
 NaN

julia> sort([2, NaN, 1, NaN, 3], lt=<) # wrong sort due to invalid lt. This behavior is undefined.
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)

Çok boyutlu dizi A'yı dims boyutu boyunca sırala. Olası anahtar kelime argümanlarının açıklaması için sort! fonksiyonunun tek boyutlu versiyonuna bakın.

Bir dizinin dilimlerini sıralamak için sortslices fonksiyonuna başvurun.

Julia 1.1

Bu fonksiyon en az Julia 1.1 gerektirir.

Örnekler

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)

sort! fonksiyonunun bir varyantı olup, v'yi değiştirmeden sıralı bir kopyasını döndürür.

Örnekler

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)

Verilen boyut boyunca çok boyutlu bir dizi A'yı sırala. Olası anahtar kelime argümanlarının açıklaması için sort! kısmına bakın.

Bir dizinin dilimlerini sıralamak için sortslices kısmına başvurun.

Örnekler

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])

Bir sıralama vektörü veya dizisi I döndürür ki bu da A[I]'yi belirtilen boyutta sıralı hale getirir. Eğer A birden fazla boyuta sahipse, dims anahtar kelime argümanı belirtilmelidir. Sıralama, sort! ile aynı anahtar kelimeleri kullanarak belirtilir. Permutasyon, sıralama algoritması kararsız olsa bile kararlıdır: eşit elemanların indeksleri artan sırada görünecektir.

Ayrıca sortperm!, partialsortperm, invperm, indexin ile de ilgili. Bir dizinin dilimlerini sıralamak için, sortslices referansına bakın.

Julia 1.9

dims kabul eden yöntem en az Julia 1.9 gerektirir.

Örnekler

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

Ekleme sıralama algoritmasını kullanın.

Ekleme sıralaması, koleksiyonu bir seferde bir öğe olarak geçer ve her öğeyi çıktı vektöründeki doğru, sıralı konumuna yerleştirir.

Özellikler:

  • kararlı: eşit karşılaştırılan öğelerin sıralamasını korur

(örneğin, büyük/küçük harf farkını göz ardı eden bir harf sıralamasında "a" ve "A").

  • bellekte yerinde.
  • kare performansı sıralanacak öğe sayısında:

küçük koleksiyonlar için iyi bir şekilde uygundur ancak büyük olanlar için kullanılmamalıdır.

source
Base.Sort.MergeSortConstant
MergeSort

Sıralama fonksiyonunun birleştirme sıralama algoritmasını kullanması gerektiğini belirtin. Birleştirme sıralaması, koleksiyonu alt koleksiyonlara böler ve her adımda her alt koleksiyonu sıralayarak tekrar birleştirir, ta ki tüm koleksiyon sıralı biçimde yeniden bir araya gelene kadar.

Özellikler:

  • kararlı: eşit karşılaştırılan öğelerin sıralamasını korur (örneğin, büyük/küçük harf farkı gözetmeyen bir harf sıralamasında "a" ve "A").
  • yerinde değil bellekte.
  • böl ve fethet sıralama stratejisi.
  • büyük koleksiyonlar için iyi performans gösterir ancak genellikle QuickSort kadar hızlı değildir.
source
Base.Sort.QuickSortConstant
Hızlı Sıralama

Sıralama fonksiyonunun hızlı sıralama algoritmasını kullanması gerektiğini belirtin, bu algoritma kararlı değildir.

Özellikler:

  • kararlı değildir: eşit olan elemanların sıralamasını korumaz (örneğin, büyük/küçük harf farkı gözetmeyen bir harf sıralamasında "a" ve "A").
  • yerinde bellek kullanımı.
  • böl ve fethet: MergeSort ile benzer sıralama stratejisi.
  • büyük koleksiyonlar için iyi performans.
source
Base.Sort.PartialQuickSortType
PartialQuickSort{T <: Union{Integer,OrdinalRange}}

Sıralama fonksiyonunun kısmi hızlı sıralama algoritmasını kullanması gerektiğini belirtir. PartialQuickSort(k), QuickSort gibi, ancak yalnızca v tam olarak sıralandığında v[k]'de yer alacak olan elemanları bulup sıralamakla yükümlüdür.

Özellikler:

  • kararsız: eşit olan elemanların sıralama düzenini korumaz (örneğin, büyük/küçük harf farkı gözetmeyen bir sıralamada "a" ve "A").
  • yerinde bellek içinde.
  • böl ve fethet: MergeSort ile benzer sıralama stratejisi.

Not edin ki PartialQuickSort(k) mutlaka tüm diziyi sıralamak zorunda değildir. Örneğin,

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])

sortperm ile benzer, ancak A ile aynı axes'e sahip önceden tahsis edilmiş bir indeks vektörü veya dizisi ix kabul eder. ix, LinearIndices(A) değerlerini içerecek şekilde başlatılır.

!!! uyarı Herhangi bir değiştirilmiş argümanın, diğer herhangi bir argümanla bellek paylaşması durumunda davranış beklenmedik olabilir.

Julia 1.9

dims kabul eden yöntem en az Julia 1.9 gerektirir.

Örnekler

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)

Bir dizi A'nın dilimlerini sıralar. Gerekli anahtar kelime argümanı dims ya bir tamsayı ya da tamsayılar demeti olmalıdır. Sıralamanın yapıldığı boyut(lar)ı belirtir.

Örneğin, eğer A bir matris ise, dims=1 satırları sıralar, dims=2 sütunları sıralar. Tek boyutlu dilimlerde varsayılan karşılaştırma fonksiyonu sıralamayı leksikografik olarak yapar.

Kalan anahtar kelime argümanları için sort! belgesine bakın.

Örnekler

julia> sortslices([7 3 5; -1 6 4; 9 -2 8], dims=1) # Satırları sırala
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) # Sütunları sırala
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

Daha yüksek boyutlar

sortslices, daha yüksek boyutlara doğal olarak genişler. Örneğin, eğer A 2x2x2 bir dizi ise, sortslices(A, dims=3) 3. boyuttaki dilimleri sıralar ve 2x2 dilimleri A[:, :, 1] ve A[:, :, 2] karşılaştırma fonksiyonuna geçirir. Daha yüksek boyutlu dilimlerde varsayılan bir sıralama olmadığını unutmayın, ancak böyle bir sıralamayı belirtmek için by veya lt anahtar kelime argümanını kullanabilirsiniz.

Eğer dims bir demet ise, dims içindeki boyutların sırası önemlidir ve dilimlerin lineer sırasını belirtir. Örneğin, eğer A üç boyutlu ise ve dims (1, 2) ise, ilk iki boyutun sıralamaları yeniden düzenlenir, böylece (kalan üçüncü boyutun) dilimleri sıralanır. Eğer dims (2, 1) olursa, aynı dilimler alınır, ancak sonuç sırası satır-büyük olur.

Daha yüksek boyutlu örnekler

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)

Bir koleksiyonun sıralı olup olmadığını test eder. Anahtar kelimeler, sıralı olarak kabul edilen sıralamayı değiştirebilir; bu, sort! belgelerinde açıklanmıştır.

Örnekler

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)

v içinde x ile eşdeğer değerlere karşılık gelen indekslerin aralığını döndürür veya v'de x ile eşdeğer değerler yoksa ekleme noktasında bulunan boş bir aralık döndürür. v vektörü, anahtar kelimeler tarafından tanımlanan sıraya göre sıralanmış olmalıdır. Anahtar kelimelerin anlamı ve eşdeğerlik tanımı için sort! kısmına bakın. by fonksiyonu, aranan değer x ile v içindeki değerlere uygulanır.

Aralık genellikle ikili arama kullanılarak bulunur, ancak bazı girdiler için optimize edilmiş uygulamalar vardır.

Ayrıca bakınız: searchsortedfirst, sort!, insorted, findall.

Örnekler

julia> searchsorted([1, 2, 4, 5, 5, 7], 4) # tek eşleşme
3:3

julia> searchsorted([1, 2, 4, 5, 5, 7], 5) # birden fazla eşleşme
4:5

julia> searchsorted([1, 2, 4, 5, 5, 7], 3) # eşleşme yok, ortada ekle
3:2

julia> searchsorted([1, 2, 4, 5, 5, 7], 9) # eşleşme yok, sonunda ekle
7:6

julia> searchsorted([1, 2, 4, 5, 5, 7], 0) # eşleşme yok, başta ekle
1:0

julia> searchsorted([1=>"one", 2=>"two", 2=>"two", 4=>"four"], 2=>"two", by=first) # çiftlerin anahtarlarını karşılaştır
2:3
source
Base.Sort.searchsortedfirstFunction
searchsortedfirst(v, x; by=identity, lt=isless, rev=false)

v içindeki x'den önce sıralanmamış ilk değerin indeksini döndürür. Eğer v içindeki tüm değerler x'den önce sıralanmışsa, lastindex(v) + 1 döner.

v vektörü, anahtar kelimeler tarafından tanımlanan sıraya göre sıralanmış olmalıdır. Döndürülen indekse x eklemek, sıralı düzeni koruyacaktır. Anahtar kelimelerin anlamı ve kullanımı için sort! kısmına bakın. by fonksiyonu, aranan değer x ile v içindeki değerlere uygulanır.

İndeks genellikle ikili arama kullanılarak bulunur, ancak bazı girdiler için optimize edilmiş uygulamalar vardır.

Ayrıca bakınız: searchsortedlast, searchsorted, findfirst.

Örnekler

julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 4) # tek eşleşme
3

julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 5) # birden fazla eşleşme
4

julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 3) # eşleşme yok, ortada ekle
3

julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 9) # eşleşme yok, sona ekle
7

julia> searchsortedfirst([1, 2, 4, 5, 5, 7], 0) # eşleşme yok, başa ekle
1

julia> searchsortedfirst([1=>"one", 2=>"two", 4=>"four"], 3=>"three", by=first) # çiftlerin anahtarlarını karşılaştır
3
source
Base.Sort.searchsortedlastFunction
searchsortedlast(v, x; by=identity, lt=isless, rev=false)

x'den sonra sıralanmamış olan v'deki son değerin indeksini döndürür. Eğer v'deki tüm değerler x'den sonra sıralanmışsa, firstindex(v) - 1 döner.

v vektörü, anahtar kelimeler tarafından tanımlanan sıraya göre sıralanmış olmalıdır. Döndürülen indeksin hemen sonrasına x eklemek, sıralı düzeni koruyacaktır. Anahtar kelimelerin anlamı ve kullanımı için sort! kısmına bakın. by fonksiyonu, aranan değer x ile v'deki değerlere uygulanır.

İndeks genellikle ikili arama kullanılarak bulunur, ancak bazı girdiler için optimize edilmiş uygulamalar vardır.

Örnekler

julia> searchsortedlast([1, 2, 4, 5, 5, 7], 4) # tek eşleşme
3

julia> searchsortedlast([1, 2, 4, 5, 5, 7], 5) # birden fazla eşleşme
5

julia> searchsortedlast([1, 2, 4, 5, 5, 7], 3) # eşleşme yok, ortada ekle
2

julia> searchsortedlast([1, 2, 4, 5, 5, 7], 9) # eşleşme yok, sona ekle
6

julia> searchsortedlast([1, 2, 4, 5, 5, 7], 0) # eşleşme yok, başa ekle
0

julia> searchsortedlast([1=>"bir", 2=>"iki", 4=>"dört"], 3=>"üç", by=first) # çiftlerin anahtarlarını karşılaştır
2
source
Base.Sort.insortedFunction
insorted(x, v; by=identity, lt=isless, rev=false) -> Bool

Bir vektör v'nin x ile eşdeğer herhangi bir değeri içerip içermediğini belirleyin. Vektör v, anahtar kelimeler tarafından tanımlanan sıraya göre sıralanmış olmalıdır. Anahtar kelimelerin anlamı ve eşdeğerlik tanımı için sort! belgesine bakın. by fonksiyonu, aranan değer x ile v'deki değerlere uygulanır.

Kontrol genellikle ikili arama kullanılarak yapılır, ancak bazı girdiler için optimize edilmiş uygulamalar vardır.

Ayrıca in belgesine bakın.

Örnekler

julia> insorted(4, [1, 2, 4, 5, 5, 7]) # tek eşleşme
true

julia> insorted(5, [1, 2, 4, 5, 5, 7]) # birden fazla eşleşme
true

julia> insorted(3, [1, 2, 4, 5, 5, 7]) # eşleşme yok
false

julia> insorted(9, [1, 2, 4, 5, 5, 7]) # eşleşme yok
false

julia> insorted(0, [1, 2, 4, 5, 5, 7]) # eşleşme yok
false

julia> insorted(2=>"TWO", [1=>"one", 2=>"two", 4=>"four"], by=first) # çiftlerin anahtarlarını karşılaştır
true
Julia 1.6

insorted Julia 1.6'da eklendi.

source
Base.Sort.partialsort!Function
partialsort!(v, k; by=identity, lt=isless, rev=false)

Vektörü v yerinde kısmen sıralayın, böylece k indeksindeki değer (veya k bir aralıksa bitişik değerler) tam sıralı olsaydı görüneceği konumda olur. Eğer k tek bir indeks ise, o değer döndürülür; eğer k bir aralık ise, o indekslerdeki değerlerin bir dizisi döndürülür. partialsort!'un girdi dizisini tamamen sıralamayabileceğini unutmayın.

Anahtar kelime argümanları için sort! belgesine bakın.

Örnekler

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)

partialsort! fonksiyonunun bir varyantıdır; v'yi kısmi sıralamadan önce kopyalar, böylece partialsort! ile aynı şeyi döndürür, ancak v'yi değiştirmeden bırakır.

source
Base.Sort.partialsortpermFunction
partialsortperm(v, k; by=identity, lt=isless, rev=false)

Vektör v'nin kısmi bir permütasyonunu I olarak döndürür, böylece v[I] v'nin tamamen sıralanmış bir versiyonunun k indeksindeki değerlerini döndürür. Eğer k bir aralıksa, bir indeks vektörü döndürülür; eğer k bir tam sayıysa, tek bir indeks döndürülür. Sıralama, sort! ile aynı anahtar kelimeleri kullanarak belirtilir. Permütasyon kararlıdır: eşit elemanların indeksleri artan sırada görünecektir.

Bu fonksiyon, sortperm(...)[k] çağrısına eşdeğerdir, ancak daha verimlidir.

Örnekler

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)

partialsortperm gibi, v ile aynı boyutta önceden tahsis edilmiş bir indeks vektörü ix kabul eder; bu vektör, v'nin indekslerinin (bir permütasyonu) saklanması için kullanılır.

ix, v'nin indekslerini içerecek şekilde başlatılır.

(Genellikle, v'nin indeksleri 1:length(v) olacaktır, ancak v'nin OffsetArray gibi bir alternatif dizi türü varsa ve bu tür bir-bir tabanlı indeksler içermiyorsa, ix bu aynı indeksleri paylaşmalıdır.)

Dönüşte, ix'in, aşağıdaki gibi sıralı konumlarında k indekslerini içermesi garanti edilir:

partialsortperm!(ix, v, k);
v[ix[k]] == partialsort(v, k)

Dönüş değeri, k bir tam sayı ise ix'in k'nci elemanıdır, ya da k bir aralık ise ix'e bir görünüm (view) olacaktır.

!!! uyarı Herhangi bir değiştirilmiş argümanın, başka bir argümanla bellek paylaşması durumunda davranış beklenmedik olabilir.

Örnekler

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

Şu anda temel Julia'da kamuya açık olarak mevcut olan dört sıralama algoritması bulunmaktadır:

Varsayılan olarak, sort fonksiyonları ailesi, çoğu girdi üzerinde hızlı olan kararlı sıralama algoritmalarını kullanır. Tam algoritma seçimi, gelecekteki performans iyileştirmelerine olanak tanımak için bir uygulama ayrıntısıdır. Şu anda, girdi türüne, boyutuna ve bileşimine bağlı olarak RadixSort, ScratchQuickSort, InsertionSort ve CountingSort'un bir hibriti kullanılmaktadır. Uygulama ayrıntıları değişebilir, ancak şu anda ??Base.DEFAULT_STABLE'nin genişletilmiş yardımında ve orada listelenen dahili sıralama algoritmalarının docstring'lerinde mevcuttur.

alg anahtar kelimesi ile tercih ettiğiniz algoritmayı açıkça belirtebilirsiniz (örneğin, sort!(v, alg=PartialQuickSort(10:20))) veya özel türler için varsayılan sıralama algoritmasını yeniden yapılandırmak için Base.Sort.defalg fonksiyonuna özel bir yöntem ekleyebilirsiniz. Örneğin, InlineStrings.jl aşağıdaki yöntemi tanımlar:

Base.Sort.defalg(::AbstractArray{<:Union{SmallInlineStrings, Missing}}) = InlineStringSort
Julia 1.9

Base.Sort.defalg tarafından döndürülen varsayılan sıralama algoritması, Julia 1.9'dan itibaren kararlıdır. Önceki sürümlerde sayısal dizileri sıralarken kararsız kenar durumları vardı.

Alternate Orderings

Varsayılan olarak, sort, searchsorted ve ilgili fonksiyonlar, iki öğeyi karşılaştırmak için isless kullanır ve hangisinin önce geleceğini belirler. Base.Order.Ordering soyut türü, aynı öğe kümesi üzerinde alternatif sıralamalar tanımlamak için bir mekanizma sağlar: sort! gibi bir sıralama fonksiyonu çağrıldığında, order anahtar kelime argümanı ile bir Ordering örneği sağlanabilir.

Ordering örnekleri, Base.Order.lt fonksiyonu aracılığıyla bir sıralama tanımlar; bu, isless'in genelleştirilmiş bir versiyonudur. Bu fonksiyonun özel Ordering'ler üzerindeki davranışı, strict weak order'ün tüm koşullarını karşılamalıdır. Geçerli ve geçersiz lt fonksiyonları hakkında ayrıntılar ve örnekler için sort!'ya bakın.

Base.Order.OrderingType
Base.Order.Ordering

Bir dizi eleman üzerinde katı zayıf sıralamayı temsil eden soyut tür. Daha fazla bilgi için sort! kısmına bakın.

İki elementi sıralama düzenine göre karşılaştırmak için Base.Order.lt kullanın.

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

a'nın b'den küçük olup olmadığını o sıralamasına göre test eder.

source
Base.Order.ordFunction
ord(lt, by, rev::Union{Bool, Nothing}, order::Ordering=Forward)

Aynı argümanlarla bir Ordering nesnesi oluşturun sort!. Elemanlar önce by fonksiyonu (bu identity olabilir) ile dönüştürülür ve ardından ya lt fonksiyonu ya da mevcut bir sıralama order ile karşılaştırılır. lt, isless veya sort! lt parametresinin aynı kurallarına uyan bir fonksiyon olmalıdır. Son olarak, elde edilen sıralama rev=true ise tersine çevrilir.

isless dışındaki bir lt ile Base.Order.Forward veya Base.Order.Reverse dışındaki bir order geçmek yasaktır, aksi takdirde tüm seçenekler bağımsızdır ve tüm olası kombinasyonlarda birlikte kullanılabilir.

source
Base.Order.ReverseOrderingType
ReverseOrdering(fwd::Ordering=Forward)

Bir sıralamayı tersine çeviren bir sarmalayıcıdır.

Verilen bir Ordering o için, tüm a, b için aşağıdakiler geçerlidir:

lt(ReverseOrdering(o), a, b) == lt(o, b, a)
source
Base.Order.ByType
By(by, order::Ordering=Forward)

Ordering, by fonksiyonu tarafından dönüştürülen öğelere order uygulayan bir yapıdır.

source
Base.Order.LtType
Lt(lt)

Ordering, lt(a, b) ile elemanları karşılaştırmak için çağrılır. lt, sort! parametresi ile aynı kurallara uymalıdır.

source
Base.Order.PermType
Perm(sıra::Sıralama, veri::AbstractVector)

Sıralama, veri'nin indeksleri üzerindeki sıralamadır; burada i, j'den küçükse veri[i], veri[j]'den küçük demektir. veri[i] ve veri[j] eşit olduğunda, i ve j sayısal değerlerine göre karşılaştırılır.

source