go语言中排序sort的使用方法示例
作者:熔遁丶螺旋手里剑 发布时间:2023-09-01 00:07:22
标签: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)
,虽然他们结构是一样的。
最近诸事不顺,心烦的一匹,上周也拖更了,总之希望大家事事顺心,心爱的人身体健康。
来源:http://www.cnblogs.com/baiyb/p/9163818.html


猜你喜欢
- 谷歌内部的 python 代码规范熟悉 python 一般都会努力遵循 pep8 规范,也会有一些公司制定内部的代码规范。大公司制定规范的目
- QTimer控件介绍如果在应用程序中周期性地进行某项操作,比如周期性的检测主机的cpu值,则需要用到QTimer定时器,QTimer类提供了
- PHP addcslashes() 函数实例在字符 "W" 前添加反斜杠:<?php $str = addcsla
- 前言最近在做项目的时候遇到一个问题,需要获取一个动态预览的图片的地址,这其实不是什么问题,主要是该图片的路径是写在css的backgroun
- pandas每次多Sheet写入文件,只能一次性存入,不然每次会重写文件,最后只保留最后一次的写入。# !usr/bin env pytho
- 测试字符串:<style>v\:* { BEHAVIOR: url(#default#VML) } o\:* { BEHAVIO
- 看看上一篇《javascript设计模式交流(一)Singleton Pattern》本文将讨论Prototype Pattern的js实现
- 本文主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,分享给大家,具体如下: &nb
- 一、包在我们的项目中,可能会有太多的模块但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟。我们可以将所有相同类型的模块放在一个文件夹
- 前言pydub是Python中用户处理音频文件的一个库。本文主要介绍了关于Python音频处理库pydub使用的相关内容,分享出来供大家参考
- 任何位置都能明确“我在哪里?这里有什么?从这里能去哪里?” 小时候,童话故事都告诉我们,迷路可不是一件好事。那会伴随着困惑、沮丧、
- 什么是Densenet据说Densenet比Resnet还要厉害,我决定好好学一下。ResNet模型的出现使得深度学习神经网络可以变得更深,
- function create5StarClip(context) { var n = 0; var dx = 100; var dy =
- 本文实例讲述了python实现上传样本到virustotal并查询扫描信息的方法。分享给大家供大家参考。具体方法如下:import simp
- 1. import_table介绍上期技术分享我们介绍了MySQL Load Data的4种常用的方法将文本数据导入到MySQL,这一期我们
- MS SQL Server 2000通过企业管理器设置数据库的定期自动备份计划。1、打开企业管理器,双击打开你的服务器2、然后点上面菜单中的
- SWFUpload上传组件,最初由Vinterwebb.se开发,组件主体由Flash与JavaScript整合而成,主要致力解决多文件、大
- 本文实例讲述了django框架模板语言使用方法。分享给大家供大家参考,具体如下:模板功能作用:生成html界面内容,模版致力于界面如何显示,
- 一、使用ddt和data装饰器的大致框架如下,每个test_开头的方法,代表一条测试用例from ddt import ddt,dataim
- 本文实例总结了CI框架中数据库操作函数$this->db->where()相关用法。分享给大家供大家参考,具体如下:CI 框架数