Sort包的使用

Sort包的简介

Go语言标准库sort包中实现了3种基本的排序算法:插入排序快排和堆排序。和其他语言中一样, 这三种方式都是不公开的,他们只在sort包内部使用。所以用户在使用sort包进行排序时无需考虑使 用那种排序方式,sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素 大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会 根据实际数据自动选择高效的排序算法。

Sort包的使用

Sort中有给基本数据类型如 int float 和string自定义sort

[]int 的排序

1
2
3
4
5
6
	arr := []int{1, 2, -1, 2, 10}
sort.Ints(arr)

sort.Sort(sort.IntSlice(arr))
//默认结果都是升序排列,如果我们想对一个 sortable object 进行逆序排序,可以自定义一个type。但 sort.Reverse 帮你省掉了这些代码。
sort.Sort(sort.Reverse(sort.IntSlice(arr)))

[]string的排序

1
2
3
4
5
6
ss := []string{"1", "b", "e", "ff", "-1"}
sort.Strings(ss)

sort.Sort(sort.StringSlice(ss))

sort.Sort(sort.Reverse(sort.StringSlice(ss)))

[]float64 的排序

1
2
3
4
5
6
7
fs := []float64{1.3, 2.0, -90.2, -1, 0}
sort.Float64s(fs)
//查看是否已经排序成功(从小到大)
sort.IsSorted(sort.Float64Slice(fs))

sort.Sort(sort.Reverse(sort.Float64Slice(fs)))

二分查找

go语言中的二分查找算法用来搜索指定已经排完序的切片[0:n]中值为Value的元素的下标,如果有多个相同Value的元素,则返回第一个值为Value的元素的下标;如果不存值为Value的元素,则返回切片的长度 n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nums := []int{1, 3, 5, 7, 9, 11, 13}

// 要查找的值
target := 7

// 使用Search函数查找值的索引
index := sort.Search(len(nums), func(i int) bool {
return nums[i] > target
})

// 检查是否找到
if index < len(nums) && nums[index] == target {
fmt.Printf("%d 找到在索引 %d 处\n", target, index)
} else {
fmt.Printf("%d 未找到\n", target)
}

自定义排序

自定义sort.Interface排序 ,此时我们 需要重写 Swap Less Len 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
"fmt"
"sort"
)

type Peak struct {
Name string
Height int
}

type Peaks []Peak

func (ps Peaks) Len() int {
return len(ps)
}

func (ps Peaks) Less(i, j int) bool {
return ps[i].Height < ps[j].Height
}

func (ps Peaks) Swap(i, j int) {
ps[i], ps[j] = ps[j], ps[i]
}

func main() {
ps := Peaks{{
Name: "mountain-1",
Height: 1,
}, {
Name: "mountain-2",
Height: 2,
}, {
Name: "mountain-10",
Height: -100,
}}
fmt.Println("before ", ps)
sort.Sort(ps)
fmt.Println("after ", ps)
}

使用 sort.Slice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main

import (
"fmt"
"sort"
)

type Peak struct {
Name string
Height int
}

type Peaks []Peak

func (ps Peaks) Len() int {
return len(ps)
}

func (ps Peaks) Less(i, j int) bool {
return ps[i].Height < ps[j].Height
}

func (ps Peaks) Swap(i, j int) {
ps[i], ps[j] = ps[j], ps[i]
}

func main() {
ps := Peaks{{
Name: "mountain-1",
Height: 1,
}, {
Name: "mountain-2",
Height: 2,
}, {
Name: "mountain-10",
Height: -100,
}}
fmt.Println("Before ", ps)
sort.Slice(ps, func(i, j int) bool {
return ps[i].Height <= ps[j].Height
})
fmt.Println("After ", ps)

fmt.Println("----------------")
sort.Slice(ps, func(i, j int) bool {
return ps[i].Height >= ps[j].Height
})
fmt.Println("after reverse ", ps)
}


Sort包的使用
http://example.com/2023/09/23/Sort包的使用/
作者
Forrest
发布于
2023年9月23日
许可协议