Функция sort.Stable
Функция sort.Stable выполняет стабильную сортировку
элементов слайса. Первым параметром она принимает слайс
любого типа, вторым параметром - функцию сравнения,
которая должна возвращать true, если элемент с
индексом i должен стоять перед элементом с
индексом j. В отличие от sort.Slice,
эта функция гарантирует, что равные элементы сохранят
свой относительный порядок из исходного слайса.
Синтаксис
sort.Stable(slice, func(i, j int) bool)
Пример
Давайте отсортируем слайс строк по длине с сохранением порядка элементов с одинаковой длиной:
package 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)
}
Результат выполнения кода:
[a e bb dd ccc fff]
Обратите внимание, что элементы "a" и "e",
а также "bb" и "dd" сохранили свой
исходный порядок.
Пример
Давайте сравним поведение sort.Slice и
sort.Stable на примере сортировки чисел
по четности:
package 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)
}
Результат выполнения кода:
[4 2 6 3 1 5]
Все четные числа переместились в начало, сохранив
свой исходный порядок (4, 2, 6).
Пример
Рассмотрим сортировку слайса структур по нескольким полям с использованием стабильной сортировки:
package 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)
}
Результат выполнения кода:
[{Eve 20} {Alice 25} {Charlie 25} {Bob 30} {David 30}]
Люди с одинаковым возрастом сохранили свой относительный порядок из исходного слайса.
Смотрите также
-
функцию
sort.Slice,
которая выполняет нестабильную сортировку слайса -
функцию
sort.SliceStable,
которая является алиасом для sort.Stable -
функцию
sort.SliceIsSorted,
которая проверяет, отсортирован ли слайс -
функцию
slices.SortStableFunc,
которая выполняет стабильную сортировку с использованием функций из пакета slices