1.介绍
sort
包实现了四种基本排序算法:插入排序、归并排序、堆排序、快速排序
。 但是这四种排序方法是不公开的,它们只能在 sort
包内部使用。sort
包会根据实际数据自动选择高效的排序算法,所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了 sort.Interface
定义的三个方法,就可以顺利对数据集合进行排序:
Len() int
: 获取数据集合长度。
Less() bool
: 比较两个元素大小。
Swap()
: 交换两个元素位置。
1.1 支持功能
sort
包对[]int
、[]float64
、[]string
切片提供了完整的支持,主要功能有:
- 对基本数据类型切片的排序。
- 基本数据元素查找。
- 判断基本数据类型切片是否已经排序。
- 对排好序的数据集合逆序。
2.排序
2.1 T.Sort
a. 使用方法
sliceExample := T{..,..,..}
sliceExample.Sort()
if sorted := sort.IsSorted(sliceExample);sorted{ fmt.Printf("排序成功:%+v\n",sliceExample) } else { fmt.Println("排序失败!") }
|
b. 代码示例
package test import ( "fmt" "sort" "testing" ) func TestIntSliceSort(t *testing.T) { nums := sort.IntSlice{10,40,6,9,23,72,89} nums.Sort() if sorted := sort.IsSorted(nums);sorted{ fmt.Printf("排序结果:%+v\n",nums) } else { fmt.Println("排序失败!") } }
|
2.2 sort.Ints
将 []int
进行升序排序。
a. 代码示例
func TestInts(t *testing.T) { a := []int{23,12, 9, 2, 12,3, 89} sort.Ints(a) if sorted := sort.IntsAreSorted(a); sorted { fmt.Printf("排序成功: %v\n",a) } else { fmt.Printf("排序失败: %v\n",a) } fmt.Printf("查找元素(存在): %v 索引:%v \n",12,sort.SearchInts(a, 12)) fmt.Printf("查找元素(不存在): %v 索引:%v \n",22,sort.SearchInts(a, 22)) }
|
2.3 sort.Float64s
将 []float64
进行升序排序。
a. 代码示例
func TestFloat64s(t *testing.T) { f := []float64{20.2,13.8,28.12,5.23} sort.Float64s(f) if sorted := sort.Float64sAreSorted(f); sorted { fmt.Printf("排序成功: %v\n",f) } else { fmt.Printf("排序失败: %v\n",f) } searchVal1 := 13.8 searchVal2 := 29.23 fmt.Printf("查找元素(存在): %v 索引:%v \n",searchVal1,sort.SearchFloat64s(f, searchVal1)) fmt.Printf("查找元素(不存在): %v 索引:%v \n",searchVal2,sort.SearchFloat64s(f, searchVal2)) }
|
2.4 sort.Strings
将 []string
进行升序排序。
a. 代码示例
func TestSlice(t *testing.T) { s := []string{"d", "a", "c", "e", "b"} sort.Strings(s) if sorted := sort.StringsAreSorted(s); sorted { fmt.Printf("排序成功: %v\n",s) } else { fmt.Printf("排序失败: %v\n",s) } searchVal1 := "e" searchVal2 := "f" fmt.Printf("查找元素(存在): %v 索引:%v \n",searchVal1,sort.SearchStrings(s, searchVal1)) fmt.Printf("查找元素(不存在): %v 索引:%v \n",searchVal2,sort.SearchStrings(s, searchVal2)) }
|
2.5 降序
a.降序原理
前面介绍的都是排序规则都是升序(sort
包默认都是升序),如果想要降序,可以使用sort.Reverse
来调换Less()
参数,从而实现降序的目的。
sort.Reverse 源码
func Reverse(data Interface) Interface { return &reverse{data} }
func (r reverse) Less(i, j int) bool { return r.Interface.Less(j, i) }
|
c.代码示例
func TestReverseSort(t *testing.T) { intSlice := sort.IntSlice{23, 15, 9, 2, 12, 3, 89} reverse := sort.Reverse(intSlice) sort.Sort(reverse) fmt.Printf("排序结果: %v\n", intSlice) }
|
3. 查找
3.1 查找步骤
- 步骤一:定义类型变量
- 步骤二:先排序后查找(查找是基于排序后的结果)
- 步骤三:查询可能存在的索引
- 步骤四:判断是否相等
3.2 代码示例
func TestSearch(t *testing.T) { intSlice := sort.IntSlice{10, 40, 6, 9, 23, 72, 89} intSlice.Sort() searchVal := 40 searchIndex := intSlice.Search(searchVal) if searchIndex > len(intSlice) { fmt.Printf("未找到:%v\n", searchVal) } else { if searchVal == intSlice[searchIndex] { fmt.Printf("找到: %v 索引为: %v \n", searchVal, searchIndex) } else { fmt.Printf("未找到:%v\n", searchVal) } } searchVal2 := 90 searchIndex2 := intSlice.Search(searchVal2) if searchIndex2 >= len(intSlice) { fmt.Printf("未找到:%v\n", searchVal2) } else { if searchVal2 == intSlice[searchIndex2] { fmt.Printf("找到: %v 索引为: %v \n", searchVal2, searchIndex2) } else { fmt.Printf("未找到:%v\n", searchVal2) } } }
|
根据查询出的索引,取出对应的值,看是否与查找的值相等。如果相等则认为找到,不相等则认为没有找到。