func Sort(data Interface)
Sort排序data。它调用1次data.Len确定长度,调用O(n*log(n))次data.Less和data.Swap。本函数不能保证排序的稳定性(即不保证相等元素的相对次序不变)。
func Stable(data Interface)
Stable排序data,并保证排序的稳定性,相等元素的相对次序不变。
它调用1次data.Len,O(n*log(n))次data.Less和O(n*log(n)*log(n))次data.Swap。
func IsSorted(data Interface) bool
IsSorted报告data是否已经被排序。
func Reverse(data Interface) Interface
Reverse包装一个Interface接口并返回一个新的Interface接口,对该接口排序可生成递减序列。
func Ints(a []int)
Ints函数将a排序为递增顺序。
package main
import (
"sort"
"fmt"
)
func main() {
bb1 :=[]int{2,3,1,5,2,26,7,3,0}
bb2 :=[]int{2,3,1,5,2,26,7,3,0}
bb3 :=[]int{2,3,1,5,2,26,7,3,0}
bb4 :=[]int{2,3,1,5,2,26,7,3,0}
//排序 默认升序排序 Sort排序data。它调用1次data.Len确定长度,调用O(n*log(n))次data.Less和data.Swap
//[0 1 2 2 3 3 5 7 26]
sort.Sort(sort.IntSlice(bb1))
fmt.Println(bb1)
//排序 升序排序 Stable排序data,并保证排序的稳定性,相等元素的相对次序不变。
//[0 1 2 2 3 3 5 7 26]
sort.Stable(sort.IntSlice(bb2))
fmt.Println(bb2)
//判断是否排序
//true
fmt.Println(sort.IsSorted(sort.IntSlice(bb2)))
//降序排序
ss := sort.Reverse(sort.IntSlice(bb3))
//Reverse 返回 interface 需要再调用一次 sort
sort.Sort(ss)
//[26 7 5 3 3 2 2 1 0]
fmt.Println(bb3)
//直接传入切片可以升序排序
sort.Ints(bb4)
//[0 1 2 2 3 3 5 7 26]
fmt.Println(bb4)
//查找之前需要进行升序排序 返回升序排序后找到的位置
//没有找到 返回 bb4长度 打印:false
fmt.Println(sort.SearchInts(bb4,33) != len(bb4))
//找到 返回长度 小于 bb4长度 打印:true
fmt.Println(sort.SearchInts(bb4,0) != len(bb4))
}
func Search(n int, f func(int) bool) int
Search函数采用二分法搜索找到[0, n)区间内最小的满足f(i)==true的值i。也就是说,Search函数希望f
在输入位于区间[0, n)的前面某部分(可以为空)时返回假,而在输入位于剩余至结尾的部分(可以为空)
时返回真;Search函数会返回满足f(i)==true的最小值i。如果没有该值,函数会返回n。注意,未找到时的
返回值不是-1,这一点和strings.Index等函数不同。Search函数只会用区间[0, n)内的值调用f。一般使用
Search找到值x在插入一个有序的、可索引的数据结构时,应插入的位置。这种情况下,参数f(通常是闭包)
会捕捉应搜索的值和被查询的数据集。例如,给定一个递增顺序的切片,调用Search(len(data), func(i int)
bool { return data[i] >= 23 })会返回data中最小的索引i满足data[i] >= 23。如果调用者想要知道23是否在
切片里,它必须另外检查data[i] == 23。搜索递减顺序的数据时,应使用<=运算符代替>=运算符。
func main() {
//区间必须是正整数
bb1 :=[]int{2,3,1,5,2,26,7,3,0}
//在查找之前必须要进行排序
sort.Ints(bb1)
searchVal := 0
st1 := sort.Search(len(bb1), func(i int) bool {return bb1[i] >= searchVal})
//找到范围小于 长度的值 打印true
fmt.Println(st1 != len(bb1))
searchVal = 27
st1 = sort.Search(len(bb1), func(i int) bool {return bb1[i] >= searchVal})
//没有找到 打印 false
fmt.Println(st1 != len(bb1))
}
注意:查找方法,其对应的slice必须按照进行排序,否则会出现奇怪的结果
官方有趣的例子
func GuessingGame() {
var s string
fmt.Printf("Pick an integer from 0 to 100.\n")
answer := sort.Search(100, func(i int) bool {
fmt.Printf("Is your number <= %d? ", i)
fmt.Scanf("%s", &s)
return s != "" && s[0] == 'y'
})
fmt.Printf("Your number is %d.\n", answer)
}