Функция sort.Sort

Функция sort.Sort сортирует элементы слайса, который реализует интерфейс sort.Interface. В первый параметр она принимает значение типа sort.Interface, которое должно определять три метода: Len для получения длины слайса, Less для сравнения двух элементов по индексам и Swap для обмена элементов местами. Функция сортирует слайс по возрастанию согласно условию, заданному в методе Less.

Синтаксис

gosort.Sort(data sort.Interface)

Пример с сортировкой числового слайса

Давайте отсортируем слайс чисел []int{5, 2, 8, 1, 9} по возрастанию, используя тип sort.IntSlice, который уже реализует интерфейс sort.Interface:

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  nums := []int{5, 2, 8, 1, 9}
  sort.Sort(sort.IntSlice(nums))
  fmt.Println(nums)
}

Результат выполнения кода:

go[1 2 5 8 9]

Пример с сортировкой строкового слайса

Рассмотрим сортировку слайса строк []string{"e", "b", "d", "a", "c"} в алфавитном порядке с помощью sort.StringSlice:

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  words := []string{"e", "b", "d", "a", "c"}
  sort.Sort(sort.StringSlice(words))
  fmt.Println(words)
}

Результат выполнения кода:

go[a b c d e]

Сортировка пользовательской структуры

Давайте отсортируем слайс структур Person по возрасту, реализовав интерфейс sort.Interface для пользовательского типа:

gopackage main

import (
  "fmt"
  "sort"
)

type Person struct {
  Name string
  Age  int
}

type ByAge []Person

func (a ByAge) Len() int       { return len(a) }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func (a ByAge) Swap(i, j int)    { a[i], a[j] = a[j], a[i] }

func main() {
  people := []Person{
    {"Alice", 30},
    {"Bob", 25},
    {"Charlie", 35},
  }
  sort.Sort(ByAge(people))
  fmt.Println(people)
}

Результат выполнения кода:

go[{Bob 25} {Alice 30} {Charlie 35}]

Сортировка в обратном порядке

Для сортировки в обратном порядке используйте sort.Reverse вместе с sort.Sort:

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  nums := []int{5, 2, 8, 1, 9}
  sort.Sort(sort.Reverse(sort.IntSlice(nums)))
  fmt.Println(nums)
}

Результат выполнения кода:

go[9 8 5 2 1]

Смотрите также

  • функцию sort.Ints,
    которая сортирует слайс чисел по возрастанию
  • функцию sort.Strings,
    которая сортирует слайс строк по алфавиту
  • функцию sort.Stable,
    которая выполняет устойчивую сортировку
  • функцию sort.IsSorted,
    которая проверяет, отсортирован ли слайс