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!
— Functionsort!(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ğerlt(by(x), by(y))
(veyaBase.Order.lt(order, by(x), by(y))
) doğruysa.x
,y
'den daha fazladır eğery
,x
'den daha azdır.x
vey
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 zamanfalse
döner, - asimetrik olmalıdır: eğer
lt(x, y)
doğruysa, o zamanlt(y, x)
yanlış olmalıdır, - geçişli olmalıdır:
lt(x, y) && lt(y, z)
iselt(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ğerx
vey
eşdeğer vey
vez
eşdeğer ise, o zamanx
vez
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
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.
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
Base.sort
— Functionsort(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
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
Base.sortperm
— Functionsortperm(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.
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
Base.Sort.InsertionSort
— ConstantInsertionSort
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.
Base.Sort.MergeSort
— ConstantMergeSort
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.
Base.Sort.QuickSort
— ConstantHı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.
Base.Sort.PartialQuickSort
— TypePartialQuickSort{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
Base.Sort.sortperm!
— Functionsortperm!(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.
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
Base.sortslices
— Functionsortslices(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
Order-Related Functions
Base.issorted
— Functionissorted(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
Base.Sort.searchsorted
— Functionsearchsorted(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
Base.Sort.searchsortedfirst
— Functionsearchsortedfirst(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
Base.Sort.searchsortedlast
— Functionsearchsortedlast(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
Base.Sort.insorted
— Functioninsorted(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
insorted
Julia 1.6'da eklendi.
Base.Sort.partialsort!
— Functionpartialsort!(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
Base.Sort.partialsort
— Functionpartialsort(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.
Base.Sort.partialsortperm
— Functionpartialsortperm(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
Base.Sort.partialsortperm!
— Functionpartialsortperm!(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
```
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
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.Ordering
— TypeBase.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.
Base.Order.lt
— Functionlt(o::Ordering, a, b) -> Bool
a
'nın b
'den küçük olup olmadığını o
sıralamasına göre test eder.
Base.Order.ord
— Functionord(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.
Base.Order.Forward
— ConstantBase.Order.Forward
Varsayılan sıralama isless
fonksiyonuna göre.
Base.Order.ReverseOrdering
— TypeReverseOrdering(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)
Base.Order.Reverse
— ConstantBase.Order.Reverse
isless
göre ters sıralama.
Base.Order.By
— TypeBy(by, order::Ordering=Forward)
Ordering
, by
fonksiyonu tarafından dönüştürülen öğelere order
uygulayan bir yapıdır.
Base.Order.Lt
— TypeLt(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.
Base.Order.Perm
— TypePerm(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.