前言

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的使用方法示例相关推荐

  1. 易语言 剪切板 html,易语言中嵌入html直接显示方法

    易语言中嵌入html直接显示方法 以前是作者根据经验写的一点关于嵌入HTML语言的方法,大家参考下. 技术渣渣,没有找到更高的方法,现在暂时使用这种方法,将代码本地化然后超文本浏览框调用 写到文件 ( ...

  2. R语言中读取xlsx文件的方法

    R语言中读取xlsx文件的方法 安装包 install.packages("openxlsx") library(openxlsx) 文件名+sheet的序号 data<- ...

  3. r语言barplot函数图中加标签_R语言中绘制条形图的简单方法

    原标题:R语言中绘制条形图的简单方法 条形图(bar chart)是用宽度相同的条形的高度或长短来表示数据多少的图形.它主要用来展示不同分类(横轴)下某个数值型变量(纵轴)的取值.在实际中,条形图主要 ...

  4. R语言临床诊断试验的ROC分析方法示例

    R语言临床诊断试验的ROC分析方法示例 ROC(receiver operating characteristic curve)接收者操作特征曲线,是由二战中的电子工程师和雷达工程师发明用来侦测战场上 ...

  5. ios html gif 显示,iOS中gif图的显示方法示例

    iOS中gif图的显示方法示例 发布时间:2020-09-19 06:15:42 来源:脚本之家 阅读:86 作者:蓝光95 一.前言 iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候 ...

  6. TIA博途V17中ProDiag功能的使用方法示例(三)文本列表

    TIA博途V17中ProDiag功能的使用方法示例(三)文本列表 前面给大家分享了TIA博途V17中通过ProDiag功能监控数据类型和插入文本域的具体方法,具体可参考如下链接中的内容: TIA博途V ...

  7. TIA博途V17中ProDiag功能的使用方法示例(一)PLC数据类型的监控

    TIA博途V17中ProDiag功能的使用方法示例(一)PLC数据类型的监控 如下图所示,新建一个项目,添加如下所示的FB和DB块,并新建一个数据类型,数据类型中的具体内容如右侧框中所示, 在Moto ...

  8. decode的mysql用法_oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 TH ...

  9. java方法设置切点_java相关:Spring AOP中定义切点的实现方法示例

    java相关:Spring AOP中定义切点的实现方法示例 发布于 2020-6-6| 复制链接 摘记: 本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下:一 配 ...

  10. golang的int64排序_go语言中的排序讲解

    go语言的排序思路和 c 和 c++ 有些差别. c 默认是对数组进行排序, c++ 是对一个序列进行排序, go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, ...

最新文章

  1. “不亦乐乎”是“乐”还是“悦”?
  2. 使用Javascript制作连续滚动字幕
  3. RabbitMQ分布式集群架构
  4. 将两大小完全相同的照片进行加权混合对比
  5. mysql phpmyadmin远程_phpmyadmin登录远程mysql数据库
  6. 【Hbase】HBase数据快速导入之ImportTsv
  7. C++STL笔记(五):Deque详解
  8. 2018服务器 芯片组,2018最新主板知识详解,详谈DIY(主板篇)
  9. Python学习手册之类和继承
  10. jstree取消勾选_zTree 节点勾选取消勾选 选中取消选中
  11. 飞利浦DR与PACS进行worklist多部位登记方法分享
  12. axios封装简单有效
  13. 一篇文章搞定支付宝网页支付!
  14. 【物联网方案】智慧鸡舍功能及特点
  15. 云计算销售和传统销售有什么区别
  16. 移动安全办公可行性方案
  17. 王者显示重连服务器失败,最强王者三国手游服务器连接失败 最强王者三国手游曹操学什么技能...
  18. 蓝桥杯算法训练——未名湖边的烦恼 (递归)
  19. Docker 部署ElasticSearch + Kibana
  20. Excel?最强国产开源在线表格 Luckysheet 走红GitHub!

热门文章

  1. 局域网联机_局域网联机
  2. Mac安装双系统的那些坑
  3. 微信小程序——计算从今天到某天间隔多少天
  4. vscode 显示/设置隐藏文件夹
  5. Ubuntu系统备份
  6. APICloud AVM框架 开发CRM客户管理系统
  7. [链接汇总]在用Matlab解微分方程时比较有用
  8. JAVA实现AES加密、解密
  9. 怎么用ps做一个黑底白字_ps怎么把白底黑字变成黑底白字
  10. python分号怎么用_go、java已经python中分号的使用