Функция sort.SliceStable

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

Синтаксис

gosort.SliceStable(slice, func(i, j int) bool {
  return slice[i] < slice[j]
})

Пример

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

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  nums := []int{4, 2, 5, 1, 3}
  sort.SliceStable(nums, func(i, j int) bool {
    return nums[i] < nums[j]
  })
  fmt.Println(nums)
}

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

go[1 2 3 4 5]

Пример

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

gopackage main

import (
  "fmt"
  "sort"
)

func main() {
  words := []string{"a", "abcde", "abc", "ab", "abcd"}
  sort.SliceStable(words, func(i, j int) bool {
    return len(words[i]) > len(words[j])
  })
  fmt.Println(words)
}

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

go[abcde abcd abc ab a]

Пример

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

gopackage main

import (
  "fmt"
  "sort"
)

type Person struct {
  Name string
  Age  int
}

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

  // Сначала сортируем по возрасту
  sort.SliceStable(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
  })

  fmt.Println(people)
}

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

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

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

  • функцию sort.Slice,
    которая выполняет нестабильную сортировку среза
  • функцию sort.SliceIsSorted,
    которая проверяет, отсортирован ли срез
  • функцию sort.Ints,
    которая сортирует срез целых чисел
  • функцию sort.Strings,
    которая сортирует срез строк