Функция sort.SliceStable
Функция sort.SliceStable выполняет стабильную сортировку
среза []string, []int или любого другого типа.
В отличие от sort.Slice, она гарантирует сохранение
исходного порядка равных элементов. Первым параметром
функция принимает срез, вторым - функцию сравнения,
которая возвращает true, если элемент с индексом i
должен стоять перед элементом с индексом j.
Синтаксис
sort.SliceStable(slice, func(i, j int) bool {
return slice[i] < slice[j]
})
Пример
Давайте отсортируем срез целых чисел в порядке возрастания с использованием стабильной сортировки:
package 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)
}
Результат выполнения кода:
[1 2 3 4 5]
Пример
Давайте отсортируем срез строк в порядке убывания длины:
package 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)
}
Результат выполнения кода:
[abcde abcd abc ab a]
Пример
Рассмотрим преимущество стабильной сортировки на примере сортировки структуры по нескольким полям:
package 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)
}
Результат выполнения кода:
[{Bob 25} {David 25} {Alice 30} {Charlie 30}]
Смотрите также
-
функцию
sort.Slice,
которая выполняет нестабильную сортировку среза -
функцию
sort.SliceIsSorted,
которая проверяет, отсортирован ли срез -
функцию
sort.Ints,
которая сортирует срез целых чисел -
функцию
sort.Strings,
которая сортирует срез строк