go语言中排序sort的使用方法示例
前言
sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。
已知一个的struct组成的数组,现在要按照数组中的一个字段排序。python有sort方法,那golang要怎么实现呢?其实golang也有sort方法,并且使用简单,功能强大。
方法如下:
我们先看一下sort.Sort()的源码
funcSort(dataInterface){ //Switchtoheapsortifdepthof2*ceil(lg(n+1))isreached. n:=data.Len() maxDepth:=0 fori:=n;i>0;i>>=1{ maxDepth++ } maxDepth*=2 quickSort(data,0,n,maxDepth) } funcquickSort(dataInterface,a,b,maxDepthint){ forb-a>12{//UseShellSortforslices<=12elements ifmaxDepth==0{ heapSort(data,a,b) return } maxDepth-- mlo,mhi:=doPivot(data,a,b) //Avoidingrecursiononthelargersubproblemguarantees //astackdepthofatmostlg(b-a). ifmlo-a1{ //DoShellSortpasswithgap6 //Itcouldbewritteninthissimplifiedformcauseb-a<=12 fori:=a+6;i 通过quickSort方法我们看出,根据数据不同的状况,quickSort会选择堆排,快排,插入排中更高效的排序方法,这个我们暂时先不深究,先看如何使用sort.Sort()。
从源码中我们发现数据data,需要自带Len,Less,Swap三种方法,所以使用sort.Sort()前,我们需要自己实现Len,Less,Swap来确定按照什么规则排序。
来实践一下,我们先创建一个结构体数组,结构体包含字段Count,我们按照Count对其排序。
packagemain import( "sort" ) typesubInfostruct{ Countuint`json:"count"` } typeSubList[]*subInfo func(pSubList)Swap(i,jint){p[i],p[j]=p[j],p[i]} func(pSubList)Len()int{returnlen(p)} func(pSubList)Less(i,jint)bool{returnp[i].Count>p[j].Count} funcmain(){ st_list:=SubList{} fori:=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),虽然他们结构是一样的。
最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。