Lompati ke konten utama
Modul 4 · Pelajaran 5 dari 520/50 dalam kursus~10 min
Pelajaran modul (5/5)

Menyortir dengan paket sortir

Paket standar sort mengurutkan irisan di tempat. Untuk tipe dasar (int, float64, string) ada pembantu langsung; untuk irisan lainnya Anda gunakan sort.Slice dengan fungsi less(i, j int) bool yang mendefinisikan memesan.

Pembantu untuk tipe dasar

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]

Pengurutannya di tempat: potongan asli dimutasi.

sort.Slice: penyortiran khusus

Anda meneruskan irisan dan fungsi less yang diberi dua indeks i dan j, mengembalikan true jika elemen i harus berada sebelum j:

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)

Untuk mengurutkan secara terbalik, cukup balikkan perbandingannya: return people[i].Age > people[j].Age.

Jenis yang stabil

sort.Slice tidak dijamin stabil (elemen "sama" dapat berubah urutan relatif). Untuk pengurutan stabil, gunakan sort.SliceStable:

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

Menyortir berdasarkan beberapa tombol

Pola umum: urutkan berdasarkan usia, dan untuk usia yang sama berdasarkan nama:

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

Pencarian biner

sort.SearchInts / sort.Search mengerjakan irisan yang sudah diurutkan:

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

Jika elemen tidak ada, ia mengembalikan indeks penyisipan. Anda bisa menggali ke dalam rincian ketika Anda membutuhkannya.

Generik (Go 1.21+): slices.Sort

Dari paket slices di stdlib (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
})

API yang lebih modern dan aman untuk tipe. Kompatibel dengan sort.Slice tetapi lebih dari itu ergonomis.

Cobalah

Latihan#go.m4.l5.e1
Upaya: 0Memuat…

Urutkan angka dalam urutan menaik menggunakan sort.Ints.

Memuat editor…
Tunjukkan petunjuk

`sort.Ints` mengurutkan irisan int di tempatnya.

Solusi tersedia setelah 3 upaya

Latihan#go.m4.l5.e2
Upaya: 0Memuat…

Urutkan orang berdasarkan Usia dalam urutan menaik menggunakan sort.Slice.

Memuat editor…
Tunjukkan petunjuk

Fungsi less mengembalikan nilai true ketika elemen i harus muncul SEBELUM j.

Solusi tersedia setelah 3 upaya

Quiz#go.m4.l5.e3
Siap

Bagaimana Anda mengurutkan dalam urutan menurun dengan sort.Slice?

Go
sort.Slice(s, func(i, j int) bool { return ??? })
Pilihan jawaban

Rekap

  • sort.Ints / sort.Strings / sort.Float64s untuk tipe dasar, di tempat.
  • sort.Slice(s, less) untuk irisan jenis apa pun, dengan fungsi less(i, j).
  • sort.SliceStable untuk menjaga urutan relatif untuk kunci yang sama.
  • Mengurutkan berdasarkan beberapa kunci: rangkaian if di dalam less.
  • Go 1.21+: paket slices dengan API generik (slices.Sort, slices.SortFunc).
  • Untuk kunci peta: ekstrak menjadi beberapa bagian dan urutkan.