golang 每日一练 使用golang sort包进行排序

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)
}



在线交流