golang struct数组排序_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会选择堆排,快排,插入排中更高效的排序方法,这个我们暂时先不深究,先看如何使用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) ,虽然他们结构是一样的。
最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
本文标题: go语言中排序sort的使用方法示例
本文地址: http://www.cppcns.com/jiaoben/golang/230166.html
golang struct数组排序_go语言中排序sort的使用方法示例相关推荐
- 易语言 剪切板 html,易语言中嵌入html直接显示方法
易语言中嵌入html直接显示方法 以前是作者根据经验写的一点关于嵌入HTML语言的方法,大家参考下. 技术渣渣,没有找到更高的方法,现在暂时使用这种方法,将代码本地化然后超文本浏览框调用 写到文件 ( ...
- R语言中读取xlsx文件的方法
R语言中读取xlsx文件的方法 安装包 install.packages("openxlsx") library(openxlsx) 文件名+sheet的序号 data<- ...
- r语言barplot函数图中加标签_R语言中绘制条形图的简单方法
原标题:R语言中绘制条形图的简单方法 条形图(bar chart)是用宽度相同的条形的高度或长短来表示数据多少的图形.它主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值.在实际中,条形图主要 ...
- R语言临床诊断试验的ROC分析方法示例
R语言临床诊断试验的ROC分析方法示例 ROC(receiver operating characteristic curve)接收者操作特征曲线,是由二战中的电子工程师和雷达工程师发明用来侦测战场上 ...
- ios html gif 显示,iOS中gif图的显示方法示例
iOS中gif图的显示方法示例 发布时间:2020-09-19 06:15:42 来源:脚本之家 阅读:86 作者:蓝光95 一.前言 iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候 ...
- TIA博途V17中ProDiag功能的使用方法示例(三)文本列表
TIA博途V17中ProDiag功能的使用方法示例(三)文本列表 前面给大家分享了TIA博途V17中通过ProDiag功能监控数据类型和插入文本域的具体方法,具体可参考如下链接中的内容: TIA博途V ...
- TIA博途V17中ProDiag功能的使用方法示例(一)PLC数据类型的监控
TIA博途V17中ProDiag功能的使用方法示例(一)PLC数据类型的监控 如下图所示,新建一个项目,添加如下所示的FB和DB块,并新建一个数据类型,数据类型中的具体内容如右侧框中所示, 在Moto ...
- decode的mysql用法_oracle中decode函数的使用方法示例
decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 TH ...
- java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例
java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...
- golang的int64排序_go语言中的排序讲解
go语言的排序思路和 c 和 c++ 有些差别. c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, ...
最新文章
- “不亦乐乎”是“乐”还是“悦”?
- 使用Javascript制作连续滚动字幕
- RabbitMQ分布式集群架构
- 将两大小完全相同的照片进行加权混合对比
- mysql phpmyadmin远程_phpmyadmin登录远程mysql数据库
- 【Hbase】HBase数据快速导入之ImportTsv
- C++STL笔记(五):Deque详解
- 2018服务器 芯片组,2018最新主板知识详解,详谈DIY(主板篇)
- Python学习手册之类和继承
- jstree取消勾选_zTree 节点勾选取消勾选 选中取消选中
- 飞利浦DR与PACS进行worklist多部位登记方法分享
- axios封装简单有效
- 一篇文章搞定支付宝网页支付!
- 【物联网方案】智慧鸡舍功能及特点
- 云计算销售和传统销售有什么区别
- 移动安全办公可行性方案
- 王者显示重连服务器失败,最强王者三国手游服务器连接失败 最强王者三国手游曹操学什么技能...
- 蓝桥杯算法训练——未名湖边的烦恼 (递归)
- Docker 部署ElasticSearch + Kibana
- Excel?最强国产开源在线表格 Luckysheet 走红GitHub!