Ana içeriğe geç
Modül 4 · Ders 5 ders 5Kurstaki 20/50~10 min
Modül dersleri (5/5)

Sıralama paketiyle sıralama

Standart sort paketi dilimleri yerinde sıralar. Baz türleri için (int, float64, string) doğrudan yardımcılar vardır; başka bir dilim için sort.Slice işlevini tanımlayan bir less(i, j int) bool işleviyle kullanın. Sipariş vermek.

Temel türler için yardımcılar

Go
import "sort"

nums := []int{5, 2, 8, 1}
sort.Ints(nums)        // [1 2 5 8]

words := []string{"c", "a", "b"}
sort.Strings(words)    // [a b c]

fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs)      // [0.5 1.5 2.5]

Sıralama yerindedir: Orijinal dilim mutasyona uğramıştır.

sort.Slice: özel sıralama

Dilimi ve less işlevini iletirsiniz; bu, iki dizin verildiğinde i ve j, i öğesinin j'den önce gelmesi gerekiyorsa true değerini döndürür:

Go
type Person struct {
    Name string
    Age  int
}

people := []Person{
    {"Bruno", 30},
    {"Anna", 25},
    {"Carla", 28},
}

sort.Slice(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)

Tersine sıralamak için karşılaştırmayı ters çevirmeniz yeterlidir: return people[i].Age > people[j].Age.

Kararlı sıralama

sort.Slice'nin kararlı olduğu garanti edilmez ("eşit" öğeler değişebilir) göreceli sıra). Kararlı bir sıralama için sort.SliceStable kullanın:

Go
sort.SliceStable(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})

Birden çok tuşa göre sıralama

Ortak kalıp: Yaşa göre sıralayın ve eşit yaşlar için ada göre sıralayın:

Go
sort.Slice(people, func(i, j int) bool {
    if people[i].Age != people[j].Age {
        return people[i].Age < people[j].Age
    }
    return people[i].Name < people[j].Name
})

İkili arama

sort.SearchInts / sort.Search önceden sıralanmış dilimler üzerinde çalışır:

Go
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5)   // 2

Öğe orada değilse ekleme dizinini döndürür. Kazabilirsin İhtiyacınız olduğunda ayrıntılara girin.

Jenerikler (1.21+ sürümüne geçin): slices.Sort

Stdlib'deki slices paketinden (Go 1.21):

Go
import "slices"

nums := []int{3, 1, 2}
slices.Sort(nums)               // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
    return a.Age - b.Age        // -1/0/1
})

Daha modern, tür açısından güvenli API. sort.Slice ile uyumlu ancak daha fazlası ergonomik.

Deneyin

Egzersiz#go.m4.l5.e1
Denemeler: 0Yükleniyor…

sort.Ints'i kullanarak sayıları artan düzende sıralayın.

Düzenleyici yükleniyor…
İpucu göster

'sort.Ints' int dilimini yerinde sıralar.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m4.l5.e2
Denemeler: 0Yükleniyor…

sort.Slice'ı kullanarak insanları Yaşa göre artan düzende sıralayın.

Düzenleyici yükleniyor…
İpucu göster

less işlevi, i öğesinin j'den ÖNCE gelmesi gerektiğinde true değerini döndürür.

3 denemeden sonra çözüm mevcut

Quiz#go.m4.l5.e3
Hazır

sort.Slice ile azalan düzende nasıl sıralama yaparsınız?

Go
sort.Slice(s, func(i, j int) bool { return ??? })
Cevap seçenekleri

Özet

  • Temel türler için yerinde sort.Ints / sort.Strings / sort.Float64s.
  • less(i, j) işleviyle her türden dilim için sort.Slice(s, less).
  • sort.SliceStable eşit anahtarların göreli sırasını korumak için.
  • Birden fazla anahtara göre sıralama: less içindeki if'lerden oluşan bir basamak.
  • 1.21+ sürümüne geçin: Genel bir API içeren slices paketi (slices.Sort, slices.SortFunc).
  • Harita anahtarları için: bir dilime çıkarın ve sıralayın.