Golang排序功能详解 - sort包的使用指南
Golang排序功能详解 - sort包的使用指南
package main
import (
"fmt"
"sort"
)
func main() {
xs := []string{"cherry", "apple", "blueberry"}
sort.Strings(xs)
fmt.Println(xs)
}
包 sort 提供了用于排序切片和用户定义集合的基本操作。
什么是基本操作?
什么是集合?
Strings 函数按递增顺序对字符串切片进行排序。
递增顺序是什么意思?这与字母排序有关吗?
例如,在示例中看起来字符串切片中的元素通过 sort.Strings(xs) 进行了字母排序。实际情况是这样吗?
我没有注意到已经超出了分配时间15分钟。
更多关于Golang排序功能详解 - sort包的使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html
越来越清晰了。
NobbZ:
在导入中分配。
不明白这是什么意思
更多关于Golang排序功能详解 - sort包的使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好的,明白了。感谢您的耐心。
也许我在这里用错了限定符这个术语,但我已经习惯了这么用,而且大多数人都能理解。我对这个术语的使用源于"完全限定名称"这个概念。
可以把它理解为导入时分配给包的名称。
有趣的信息,我会保存下来。
是通过 sort.Strings(xs) 按字母顺序排列的吗?这就是实际发生的情况吗?
某种程度上是的。小写字母比对应的大写字母"大"得多。甚至大于那些比小写字母对应大写字母更大的大写字母。(
"A" < "Z" && "Z" < "a"的结果是true!)
基本上,字符串是通过"逐个
rune"比较来排序的,每个rune可以解释为一个数字,相当于 Unicode 码点。
非常有趣。
https://play.golang.org/p/NgkdtxrbZVW
请别嫌我笨,在 sort.Sort 中 sort 和 Sort 有关联吗?我需要明确的解释
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
type ByAge []Person
func (a ByAge) Len() int { return len(a) }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func main() {
people := []Person{
{"Bob", 31},
{"John", 42},
{"Michael", 17},
{"Jenny", 26},
}
fmt.Println(people)
sort.Sort(ByAge(people))
fmt.Println(people)
}
cherilexvold1974:
什么是基本类型?
在这种情况下,指的是最基础的工作构建模块。
cherilexvold1974:
什么是集合?
可以包含零个、一个或多个独立数据片段的数据类型,比如切片。
cherilexvold1974:
递增顺序是什么意思?和字母排序有关吗?
递增顺序意味着值最小的项目排在最前面,值最大的项目排在最后,这样 first <= last 始终为 true。
cherilexvold1974:
通过 sort.Strings(xs) 进行字母排序。是这样吗?
只是某种程度上正确。小写字母比对应的大写字母"更大"。甚至比那些大于对应小写字母的大写字母还要大。("A" < "Z" && "Z" < "a" 是 true!)
基本上,字符串是通过"逐个 rune"比较来排序的,每个 rune 可以解释为一个数字,相当于 Unicode 码点。
在 sort.Sort 中,小写的 sort 是包限定符
来自维基百科,自由的百科全书。在 C、C++ 和 D 编程语言中,类型限定符是应用于类型的关键字,从而产生限定类型。例如,const int 是表示常量整数的限定类型,而 int 是相应的非限定类型,只是一个整数。
来自 Stack Overflow,限定符添加了额外的"特性",例如指定变量的易变性或常量性。它们类似于形容词:“一个善变的男人”、“一个易变的整数”、“一个廉洁的女士”、“一个常量双精度”。无论是否有限定符,变量本身仍占用相同数量的内存,并且每个位对状态/值的解释或贡献都相同。限定符只是指定了如何访问它或存储位置的一些信息。
关键字是预定义的保留标识符(可以说,见下文),语言本身赋予它们一些含义,而不是留给你用于自己的目的(即命名你的变量、类型、命名空间、函数……)。
示例
volatile和const既是限定符又是关键字if、class、namespace是关键字但不是限定符std、main、iostream、x、my_counter都是标识符,但既不是关键字也不是限定符
在 http://www.cppreference.com/wiki/keywords/start 有一个完整的关键字列表。C++ 目前没有任何不是关键字的限定符(即它们都是"单词"而不是一些标点符号)。
我的理解正确吗?
大写的 Sort 是该包中函数的名称。
这个我理解。
谢谢
在Go语言中,sort包提供了对切片和用户自定义集合进行排序的功能。以下是针对您问题的详细解释:
1. 基本操作
sort包提供的基本操作包括:
- 对内置类型(
int、float64、string)切片的排序 - 通过实现
sort.Interface接口对自定义类型排序 - 检查切片是否已排序
示例代码:
package main
import (
"fmt"
"sort"
)
func main() {
// 整数排序
ints := []int{3, 1, 4, 1, 5}
sort.Ints(ints)
fmt.Println("Sorted ints:", ints) // [1 1 3 4 5]
// 检查是否已排序
fmt.Println("Is sorted:", sort.IntsAreSorted(ints)) // true
}
2. 集合
在Go中,集合通常指切片(slice)、数组或实现了sort.Interface的自定义数据结构。sort包主要处理切片排序。
3. 递增顺序与字母排序
递增顺序对于字符串确实按字典序(字母顺序)排列:
- 大写字母在小写字母之前(ASCII顺序)
- 数字在字母之前
- 按字符逐个比较
示例验证:
package main
import (
"fmt"
"sort"
)
func main() {
words := []string{"Apple", "apple", "123", "abc", "Zoo"}
sort.Strings(words)
fmt.Println(words) // [123 Apple Zoo abc apple]
}
4. sort.Strings的实际行为
sort.Strings确实按字典序排序,但需要注意:
- 区分大小写(大写字母优先)
- 基于UTF-8编码比较
对于不区分大小写的排序:
package main
import (
"fmt"
"sort"
"strings"
)
type caseInsensitive []string
func (c caseInsensitive) Len() int { return len(c) }
func (c caseInsensitive) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
func (c caseInsensitive) Less(i, j int) bool {
return strings.ToLower(c[i]) < strings.ToLower(c[j])
}
func main() {
fruits := []string{"cherry", "Apple", "blueberry"}
sort.Sort(caseInsensitive(fruits))
fmt.Println(fruits) // [Apple blueberry cherry]
}
5. 原代码分析
您的示例代码:
xs := []string{"cherry", "apple", "blueberry"}
sort.Strings(xs)
fmt.Println(xs) // [apple blueberry cherry]
输出确实是按字母顺序排列的,因为所有字符串都是小写,按字典序比较结果为:"apple" < "blueberry" < "cherry"。
sort包通过快速排序算法实现排序,时间复杂度为O(n log n),是原地排序(不创建新切片)。


