go语言中排序sort的使用方法示例
程序员文章站
2022-11-05 22:35:41
前言
sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序...
前言
sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.interface定义的三个方法:获取数据集合长度的len()方法、比较两个元素大小的less()方法和交换两个元素位置的swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。
已知一个的struct组成的数组,现在要按照数组中的一个字段排序。python有sort方法,那golang要怎么实现呢?其实golang也有sort方法,并且使用简单,功能强大。
方法如下:
我们先看一下sort.sort()的源码
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) } func quicksort(data interface, a, b, maxdepth int) { for b-a > 12 { // use shellsort for slices <= 12 elements if maxdepth == 0 { heapsort(data, a, b) return } maxdepth-- mlo, mhi := dopivot(data, a, b) // avoiding recursion on the larger subproblem guarantees // a stack depth of at most lg(b-a). if mlo-a < b-mhi { quicksort(data, a, mlo, maxdepth) a = mhi // i.e., quicksort(data, mhi, b) } else { quicksort(data, mhi, b, maxdepth) b = mlo // i.e., quicksort(data, a, mlo) } } if b-a > 1 { // do shellsort pass with gap 6 // it could be written in this simplified form cause b-a <= 12 for i := a + 6; i < b; i++ { if data.less(i, i-6) { data.swap(i, i-6) } } insertionsort(data, a, b) } }
通过quicksort方法我们看出,根据数据不同的状况,quicksort会选择堆排,快排,插入排中更高效的排序方法,这个我们暂时先不深究,先看如何使用sort.sort()
。
从源码中我们发现数据data,需要自带len,less,swap三种方法,所以使用sort.sort()
前,我们需要自己实现len,less,swap来确定按照什么规则排序。
来实践一下,我们先创建一个结构体数组,结构体包含字段count,我们按照count对其排序。
package main import ( "sort" ) type subinfo struct { count uint `json:"count"` } type sublist []*subinfo func (p sublist) swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p sublist) len() int { return len(p) } func (p sublist) less(i, j int) bool { return p[i].count > p[j].count } func main() { st_list := sublist{} for i := 0; i < 10; i ++{ _sub := &subinfo{ count: uint(i), } st_list = append(st_list, _sub) } sort.sort(st_list) return }
需要注意的是,st_list只能初始化成sublist{}
,而不能初始化为make([]*subinfo, 0)
,虽然他们结构是一样的。
最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。