Golang 如何对slice进行稳定排序
在Go语言中slice比数组更强大、灵活、方便,是一种轻量级的数据结构。slice是一个可变长度的序列,它存储了相似类型的元素,你不允许在同一个slice中存储不同类型的元素。
在Go语言中,你可以使用 SliceStable() 函数对slice进行稳定排序。这个函数对指定的分片进行排序,同时保持相等元素的原始顺序。如果指定的界面不是一个片断,这个函数就会恐慌。它被定义在sort包下,因此,你必须在你的程序中导入sort包以访问SliceStable函数。
语法
func SliceStable(a_slice interface{}, less func(p, q int) bool)
例子
// Go program to illustrate how
// to sort a slice stable
package main
import (
"fmt"
"sort"
)
// Main function
func main() {
// Creating and initializing a structure
Author := []struct {
a_name string
a_article int
a_id int
}{
{"Mina", 304, 1098},
{"Cina", 634, 102},
{"Tina", 104, 105},
{"Mina", 34, 109},
{"Cina", 634, 102},
{"Mina", 4, 100},
{"Rohit", 56, 1098},
{"Cina", 634, 102},
{"Mina", 39, 1098},
{"Sohit", 20, 110},
}
// Sorting Author by their names
// Using SliceStable() function
sort.SliceStable(Author, func(p, q int) bool {
return Author[p].a_name < Author[q].a_name })
fmt.Println("Sort Author according to their names:")
fmt.Println(Author)
// Sorting Author by the total articles
// Using SliceStable() function
sort.SliceStable(Author, func(p, q int) bool {
return Author[p].a_article < Author[q].a_article })
fmt.Println()
fmt.Println("Sort Author according to their"+
" total number of articles:")
fmt.Println(Author)
// Sorting Author by their ids
// Using SliceStable() function
sort.SliceStable(Author, func(p, q int) bool {
return Author[p].a_id < Author[q].a_id })
fmt.Println()
fmt.Println("Sort Author according to the their Ids:")
fmt.Println(Author)
}
输出
Sort Author according to their names:
[{Cina 634 102} {Cina 634 102} {Cina 634 102} {Mina 304 1098} {Mina 34 109} {Mina 4 100} {Mina 39 1098} {Rohit 56 1098} {Sohit 20 110} {Tina 104 105}]
Sort Author according to their total number of articles:
[{Mina 4 100} {Sohit 20 110} {Mina 34 109} {Mina 39 1098} {Rohit 56 1098} {Tina 104 105} {Mina 304 1098} {Cina 634 102} {Cina 634 102} {Cina 634 102}]
Sort Author according to the their Ids:
[{Mina 4 100} {Cina 634 102} {Cina 634 102} {Cina 634 102} {Tina 104 105} {Mina 34 109} {Sohit 20 110} {Mina 39 1098} {Rohit 56 1098} {Mina 304 1098}]