golang

Golang使用Sort包排序小结

懵懂的女人 提交于 2019-12-05 01:48:16
转载自: https://segmentfault.com/a/1190000008062661 https://www.jianshu.com/p/6cdbba0e30b5 Go的sort包提供了封装好的排序方法 对基础类型排序可以调用sort.Ints(IntList)、sort.Float64s(FloatList)、sort.Strings(StringList)等方法,默认为从小到大的升序排序,若想要修改为降序排序,则对Less()方法进行修改即可,Less方法是Sort包排序比较的核心,它定义了排序究竟是使用什么方式进行比较,对于基础类型可以使用sort.Sort(sort.Reverse(sort.IntSlice(IntList)))这种封装好的方法进行排序,无需对sort的方法进行重载 对于结构体排序算法,我们需要先理解sort包n内部是如何实现的: func Sort(data Interface) { n := data.Len() quickSort(data, 0, n, maxDepth(n)) } 这是Sort()的实现代码,可以看到其内部是使用快排实现的,除了快排以外,Sort包还提供了插入、堆排、归并的实现: //插入排序 func insertionSort(data Interface, a, b int) //堆排序 func

Golang对自定义类型排序

女生的网名这么多〃 提交于 2019-12-05 01:47:42
在实际项目中用到对结构按结构体中的某个字段进行排序,在网上查到一个比较好的办法,mark一下。 首先golang的sort包提供了基本的排序,包括插入排序(insertionSort)、归并排序(symMerge)、堆排序(heapSort)和快速排序(quickSort)。其实现如下 func Sort(data Interface) { // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. n := data.Len() maxDepth := 0 for i := n; i > 0; i >>= 1 { maxDepth++ } maxDepth *= 2 quickSort(data, 0, n, maxDepth) } type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes

golang使用sort包排序

大兔子大兔子 提交于 2019-12-05 01:46:13
1. sort包简介 sort包实现了四种基本排序算法: 插入排序、归并排序、堆排序和快速排序 。 但是,这四种排序方法不是公开的,它们只在sort包内部被使用。所以,在对数据集合排序时,不必考虑应当选择哪一种排序方法,只要实现了sort.Interface定义的三个方法,就可以顺利对数据集合进行排序。sort.Interface接口定义的三个方法为:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法。根据实际数据,sort包会自动选择高效的排序算法。 除此之外,为了方便对常用数据类型的操作,sort包提供了对[]int切片、[]float64切片和[]string切片的完整支持,主要包括: 对基本数据类型切片的排序支持。 基本数据元素查找。 判断基本数据类型切片是否已经排好序。 对排好序的数据集合逆序。 2. 数据集合排序 2.1 实现排序接口的三个基本方法 对数据集合(包括自定义数据类型的集合)排序,需要实现 sort.Interface接口的三个方法 : type Interface interface { // 获取数据集合元素个数 Len() int // 如果i索引的数据小于j索引的数据,返回true,不会调用下面的Swap(),即数据升序排序。 Less(i, j int) bool //

golang sort包Search方法实例

﹥>﹥吖頭↗ 提交于 2019-12-05 01:42:36
函数声明 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。 note: 通过看源码和测试该函数不一定能找到最小的满足f(i)==true的值,不知道是不是GO的bug,还是自己哪里理解有误,还在研究 源码分析 func Search(n int, f func(int) bool) int { i, j := 0, n for i < j { //计算二分值,等同于 (i+j) /2 //没有使用(i+j)/2的原因是 为了避免数值太大时,溢出 h := int(uint(i+j) >> 1) // i ≤ h < j if !f(h) { //f(h)为false时,将i从二分位向后移(查询后面是否有f(n)为true的值) //这里也可以看出来i后移之后i前面的值就不会在扫描了 /

golang sort —— 排序算法

北慕城南 提交于 2019-12-05 01:41:17
sort —— 排序算法 该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。 除此之外,为了方便对常用数据类型的操作,sort包提供了对[]int切片、[]float64切片和[]string切片完整支持,主要包括: 对基本数据类型切片的排序支持 基本数据元素查找 判断基本数据类型切片是否已经排好序 对排好序的数据集合逆序 3.1.1 数据集合排序 前面已经提到过,对数据集合(包括自定义数据类型的集合)排序需要实现sort.Interface接口的三个方法,我们看以下该接口的定义: type Interface interface { // 获取数据集合元素个数 Len() int // 如果i索引的数据小于j所以的数据,返回true,不会调用 // 下面的Swap(),即数据升序排序。 Less(i, j int) bool // 交换i和j索引的两个元素的位置 Swap(i, j int) }

golang: 使用 sort 来排序

ⅰ亾dé卋堺 提交于 2019-12-05 01:40:50
golang sort package: https://golang.org/src/sort sort 操作的对象通常是一个 slice,需要满足三个基本的接口,并且能够使用整数来索引 // A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of the collection be enumerated by an integer index. type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with indexes i and j. Swap(i, j int) } ex-1 对 []int 从小到大排序

Go语言(Golang)sort包的使用

我的梦境 提交于 2019-12-05 01:40:05
import "sort" sort包提供了 排序 切片和用户自定义数据集的函数。 通过使用golang提供的包sort,可以快速实现复杂结构的数据排序。 如果要使用sort,需要实现sort下 Interface对应的方法:Len()、Less()、Swap()3个方法。 package sort // A type, typically a collection, that satisfies sort.Interface can be // sorted by the routines in this package. The methods require that the // elements of the collection be enumerated by an integer index. type Interface interface { // Len is the number of elements in the collection. Len() int // Less reports whether the element with // index i should sort before the element with index j. Less(i, j int) bool // Swap swaps the elements with

golang中结构体的初始化方法(new方法)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 01:39:12
2019独角兽企业重金招聘Python工程师标准>>> 自定义一个结构体 type Rect struct { x, y float64 width, height float64 } 初始化方法: rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{width:100, height:200} 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法 a := Rect{} 则表示这个是一个Rect{}类型.两者是不一样的.参考代码: func main() { rect1 := &Rect{0, 0, 100, 200} rect1.x = 10 a := Rect{} a.x = 15 fmt.Printf("%v\n%T\n", a, a) fmt.Printf("%v\n%T\n", rect1, rect1) } 运行结果为: {15 0 0 0} main.Rect &{10 0 100 200} *main.Rect 从结果中可以清楚的看到两者的不同. 在Go语言中,未进行初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false, int类型的零值为0, string类型的零值为空字符串.

golang type的使用

六眼飞鱼酱① 提交于 2019-12-05 01:38:04
目录 定义结构体 定义类型 定义interface 定义函数类型 类型别名 定义结构体 type node struct { val int } 定义类型 type num int // num类型与int类型等价 定义interface type sort interface { } 定义函数类型 type handler func(msg string) int 类型别名 type I int type D = int 类型定义与类型别名的区别: 类型定义是完全定义了一种全新的类型,而类型别名只是给现有的类型取了一个别名。 可以给某些类型取别名,使用方便 type strMap2Any = map[string]interface {} 来源: CSDN 作者: katy的小乖 链接: https://blog.csdn.net/u010918487/article/details/93790448

Golang必备技巧:接口型函数

落花浮王杯 提交于 2019-12-05 01:36:03
接口型函数,指的是用函数实现接口,这样在调用的时候就会非常简便,我称这种函数,为接口型函数,这种方式适用于只有一个函数的接口。 我们以迭代一个map为例,演示这一技巧,这种方式有点类似于groovy中Map的each方法一样,也是Gradle里each闭包。 原始接口实现 type Handler interface { Do(k, v interface {}) } func Each(m map [ interface {}] interface {}, h Handler) { if m != nil && len (m) > 0 { for k, v := range m { h.Do(k, v) } } } 首先定义一个Handler接口,只有一个Do方法,接收k,v两个参数,这就是一个接口了,我们后面会实现他,具体做什么由我们的实现决定。 然后我们定义了一个Each函数,这个函数的功能,就是迭代传递过来的map参数,然后把map的每个key和value值传递给Handler的Do方法,去做具体的事情,可以是输出,也可以是计算,具体由这个Handler的实现来决定,这也是面向接口编程。 现在我们就以新学期开学,大家自我介绍为例,演示使用我们刚刚定义的Each方法和Handler接口。这里我们假设有三个学生,分别为:张三,李四和王五,他们每个人都要介绍自己的名字和年龄。