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

10 回复

越来越清晰了。

NobbZ:

在导入中分配。

不明白这是什么意思

更多关于Golang排序功能详解 - sort包的使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,明白了。感谢您的耐心。

sort.Sort 中,小写的 sort 是包限定符,大写的 Sort 是该包中的函数名称。

您知道当需要使用外部包时,需要像import ("sort")这样导入它。

也可以这样操作:

Import (
  s "sort"
)

然后就可以通过s.Sort的方式使用其函数。

这就是我所说的"分配名称"的含义。

也许我在这里用错了限定符这个术语,但我已经习惯了这么用,而且大多数人都能理解。我对这个术语的使用源于"完全限定名称"这个概念。

可以把它理解为导入时分配给包的名称。

有趣的信息,我会保存下来。

是通过 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,限定符添加了额外的"特性",例如指定变量的易变性或常量性。它们类似于形容词:“一个善变的男人”、“一个易变的整数”、“一个廉洁的女士”、“一个常量双精度”。无论是否有限定符,变量本身仍占用相同数量的内存,并且每个位对状态/值的解释或贡献都相同。限定符只是指定了如何访问它或存储位置的一些信息。

关键字是预定义的保留标识符(可以说,见下文),语言本身赋予它们一些含义,而不是留给你用于自己的目的(即命名你的变量、类型、命名空间、函数……)。

示例

  • volatileconst 既是限定符又是关键字
  • ifclassnamespace 是关键字但不是限定符
  • stdmainiostreamxmy_counter 都是标识符,但既不是关键字也不是限定符

http://www.cppreference.com/wiki/keywords/start 有一个完整的关键字列表。C++ 目前没有任何不是关键字的限定符(即它们都是"单词"而不是一些标点符号)。

我的理解正确吗?

大写的 Sort 是该包中函数的名称。

这个我理解。

谢谢

在Go语言中,sort包提供了对切片和用户自定义集合进行排序的功能。以下是针对您问题的详细解释:

1. 基本操作
sort包提供的基本操作包括:

  • 对内置类型(intfloat64string)切片的排序
  • 通过实现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),是原地排序(不创建新切片)。

回到顶部