Skip to content

sort

TIP

Если вы используете версию выше 1.21, рекомендуется использовать стандартную библиотеку slices для сортировки, так как она поддерживает обобщения и имеет более продуманный API.

В пакете sort в Go предоставляются официально реализованные методы сортировки, большинство из которых можно использовать сразу. Если требуется сортировка структур, необходимо реализовать три метода интерфейса sort.Interface: Len(), Swap(), Less(). Поскольку официальная библиотека уже реализовала три типа Float64Slice, StringSlice, IntSlice, их можно использовать напрямую без собственной реализации.

go
type Interface interface {
   // Метод получения длины
   Len() int

   // Метод сравнения
   Less(i, j int) bool

   // Метод обмена
   Swap(i, j int)
}

Сортировка целых чисел

go
func main() {
   ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
   sort.Ints(ints)
}

Сортировка чисел с плавающей точкой

go
func main() {
   floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
   sort.Float64s(floats)
   fmt.Println(floats)
}

Сортировка строк

go
func main() {
   strings := []string{"helloworld", "aaa", "bbb", "ccc"}
   sort.Strings(strings)
}

Обратная сортировка

Необходимо сначала обернуть через sort.Reverse, затем выполнить сортировку:

go
func main() {
  floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
  sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
  fmt.Println(floats)
}

Пользовательская сортировка

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

go
type Person struct {
  UserId   string
  Username string
  Age      int
  Address  string
}

type PersonSlice []Person

// Возвращает длину среза
func (p PersonSlice) Len() int {
  return len(p)
}

// Метод сравнения
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// Метод обмена
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

Поскольку сравнение выполняется по возрасту, результат будет отсортирован по возрастанию возраста.

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   fmt.Println(persons)
}

Проверка на упорядоченность

Проверяет, упорядочен ли срез. Внутри не выполняется операция сортировки, а производится циклический вызов Less() для проверки:

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   println(sort.IsSorted(PersonSlice(persons)))
}

Golang by www.golangdev.cn edit