golang sort 排序

对着背影说爱祢 提交于 2019-12-05 01:50:23

func Float64s(a []float64)                            // Float64s 以升序排序 float64 切片
func Float64sAreSorted(a []float64) bool    // Float64sAreSorted 判定 float64 切片是否已经进行排序

func Ints(a []int)                                           // Ints 以升序排列 int 切片。
func IntsAreSorted(a []int) bool                   // IntsAreSorted 判断 int 切片是否已经按升序排列。

func IsSorted(data Interface) bool              // IsSorted 判断数据是否已经排序。包括各种可sort的数据类型的判断.

func Strings(a []string)                                // Strings 以升序排列 string 切片。
func StringsAreSorted(a []string) bool        // StringsAreSorted 判断 string 切片是否已经按升序排列。

package main

import (
	"fmt"
	"sort"
)

func main() {
	a := []int{1, 3, 5, 4, 2}
	b := []float64{1.1, 2.3, 5.3, 3.4}
	c := []string{"ds", "ca", "ab", "sd"}
	if !sort.IntsAreSorted(a) {
		sort.Ints(a)
	}

	if !sort.Float64sAreSorted(b) {
		sort.Float64s(b)
	}

	if !sort.StringsAreSorted(c) {
		sort.Strings(c)
	}

	fmt.Println(a) // [1 2 3 4 5]
	fmt.Println(b) // [1.1 2.3 3.4 5.3]
	fmt.Println(c) // [ab ca ds sd]
}

func Search(n int, f func(int) bool) int
search使用二分法进行查找,Search()方法回使用“二分查找”算法来搜索某指定切片[0:n],并返回能够使f(i)=true的最小的i(0<=i<n)值.
假定,如果f(i)=true,则f(i+1)=true,即对于切片[0:n],i之前的切片元素会使f()函数返回false,i及i之后的元素会使f()函数返回true。
但是,当在切片中无法找到时f(i)=true的i时(此时切片元素都不能使f()函数返回true),Search()方法会返回n(而不是返回-1)。

Search 常用于在一个已排序的,可索引的数据结构中寻找索引为 i 的值 x,例如数组或切片。
这种情况下,实参 f,一般是一个闭包,会捕获所要搜索的值,以及索引并排序该数据结构的方式。
为了查找某个值,而不是某一范围的值时,如果slice以升序排序,则f func中应该使用>=,如果slice以降序排序,则应该使用<=.
 

package main

import (
	"fmt"
	"sort"
)

func main() {

	a := []int{1, 2, 3, 4, 5}
	b := sort.Search(len(a), func(i int) bool { return a[i] >= 30 })
	fmt.Println(b) //5,查找不到,返回a slice的长度5,而不是-1

	c := sort.Search(len(a), func(i int) bool { return a[i] <= 3 })
	fmt.Println(c) //0,利用二分法进行查找,返回符合条件的最左边数值的index,即为0

	d := sort.Search(len(a), func(i int) bool { return a[i] == 3 })
	fmt.Println(d) //2

	e := sort.Search(len(a), func(i int) bool { return a[i] >= 4 })
	fmt.Println(e) //3,查找不到,返回a slice的长度5,而不是-1

}

运行结果:
5
0
2
3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!