Функция sort.Stable

Функция sort.Stable выполняет стабильную сортировку элементов слайса. Первым параметром она принимает слайс любого типа, вторым параметром - функцию сравнения, которая должна возвращать true, если элемент с индексом i должен стоять перед элементом с индексом j. В отличие от sort.Slice, эта функция гарантирует, что равные элементы сохранят свой относительный порядок из исходного слайса.

Синтаксис

gosort.Stable(slice, func(i, j int) bool)

Пример

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

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  words := []string{"a", "bb", "ccc", "dd", "e", "fff"}

  sort.Stable(words, func(i, j int) bool {
    return len(words[i]) < len(words[j])
  })

  fmt.Println(words)
}

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

go[a e bb dd ccc fff]

Обратите внимание, что элементы "a" и "e", а также "bb" и "dd" сохранили свой исходный порядок.

Пример

Давайте сравним поведение sort.Slice и sort.Stable на примере сортировки чисел по четности:

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  numbers := []int{3, 1, 4, 2, 5, 6}

  sort.Stable(numbers, func(i, j int) bool {
    return numbers[i]%2 == 0 && numbers[j]%2 != 0
  })

  fmt.Println(numbers)
}

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

go[4 2 6 3 1 5]

Все четные числа переместились в начало, сохранив свой исходный порядок (4, 2, 6).

Пример

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

gopackage main

import (
  "fmt"
  "sort"
)

type Person struct {
  Name string
  Age  int
}

func main() {
  people := []Person{
    {"Alice", 25},
    {"Bob", 30},
    {"Charlie", 25},
    {"David", 30},
    {"Eve", 20},
  }

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

  fmt.Println(people)
}

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

go[{Eve 20} {Alice 25} {Charlie 25} {Bob 30} {David 30}]

Люди с одинаковым возрастом сохранили свой относительный порядок из исходного слайса.

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

  • функцию sort.Slice,
    которая выполняет нестабильную сортировку слайса
  • функцию sort.SliceStable,
    которая является алиасом для sort.Stable
  • функцию sort.SliceIsSorted,
    которая проверяет, отсортирован ли слайс
  • функцию slices.SortStableFunc,
    которая выполняет стабильную сортировку с использованием функций из пакета slices