メインコンテンツにスキップ
モジュール 4 · レッスン 5 / 5コース内の 20/50~10 min
モジュールのレッスン (5/5)

ソートパッケージを使用したソート

標準の sort パッケージは、その場でスライスを並べ替えます。ベースタイプの場合 (int、float64、string) 直接ヘルパーがあります。他のスライスについては、 sort.Slice を、 注文すること。

基本型のヘルパー

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]

並べ替えは インプレース です。元のスライスは変更されます。

sort.Slice: カスタム並べ替え

スライスと less 関数を渡します。この関数には、i と 2 つのインデックスが与えられます。 j は、要素 i が j の前に来る必要がある場合に true を返します。

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)

逆に並べ替えるには、比較を反転するだけです。 return people[i].Age > people[j].Age。

安定したソート

sort.Slice は安定していることが保証されていません (「等しい」要素は変更される可能性があります) 相対的な順序)。安定した並べ替えを行うには、sort.SliceStable を使用します。

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

複数のキーによる並べ替え

一般的なパターン: 年齢順に並べ替え、同じ年齢の場合は名前順に並べ替えます。

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

二分探索

sort.SearchInts / sort.Search は、すでにソートされたスライスに対して動作します。

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

要素が存在しない場合は、挿入インデックスを返します。掘ることができます 必要なときに詳細を確認できます。

ジェネリック (Go 1.21 以降): slices.Sort

stdlib (Go 1.21) の slices パッケージから:

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。 sort.Slice と互換性がありますが、それ以上 人間工学に基づいた。

試してみてください

運動#go.m4.l5.e1
試行回数: 0読み込み中…

sort.Ints を使用して数値を昇順に並べ替えます。

エディターを読み込み中…
ヒントを表示

`sort.Ints` は int スライスをその場でソートします。

3 回の試行後に解決策が利用可能になります

運動#go.m4.l5.e2
試行回数: 0読み込み中…

sort.Slice を使用して、人々を年齢で昇順に並べ替えます。

エディターを読み込み中…
ヒントを表示

要素 i が j の前に来る必要がある場合、less 関数は true を返します。

3 回の試行後に解決策が利用可能になります

Quiz#go.m4.l5.e3
準備完了

sort.Slice で降順に並べ替えるにはどうすればよいですか?

Go
sort.Slice(s, func(i, j int) bool { return ??? })
回答の選択肢

要約

  • sort.Ints / sort.Strings / sort.Float64s (基本型の場合、インプレース)。
  • less(i, j) 関数を使用した、任意のタイプのスライスの sort.Slice(s, less)。
  • sort.SliceStable は、等しいキーの相対順序を保持します。
  • 複数のキーによる並べ替え: less 内の if のカスケード。
  • Go 1.21+: 汎用 API (slices.Sort、slices.SortFunc) を備えた slices パッケージ。
  • マップキーの場合: スライスに抽出してソートします。