来源:自学PHP网 时间:2019-08-07 16:47 作者:小飞侠 阅读:次
[导读] go语言中排序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会选择堆排,快排,插入排中更高效的排序方法,这个我们暂时先不深究,先看如何使用 从源码中我们发现数据data,需要自带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只能初始化成 最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对自学php网的支持。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com