当前位置:首页 > 文章列表 > Golang > Go教程 > go语言中sort包的实现方法与应用详解

go语言中sort包的实现方法与应用详解

来源:脚本之家 2022-12-27 09:40:01 0浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《go语言中sort包的实现方法与应用详解》,介绍一下排序、go语言sort包,希望对大家的知识积累有所帮助,助力实战开发!

前言

Go语言的 sort 包实现了内置和用户定义类型的排序,sort包中实现了3种基本的排序算法:插入排序.快排和堆排序.和其他语言中一样,这三种方式都是不公开的,他们只在sort包内部使用.所以用户在使用sort包进行排序时无需考虑使用那种排序方式,sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。

之前跟大家分享了Go语言使用sort包对任意类型元素的集合进行排序的方法,感兴趣的朋友们可以参考这篇文章:https://www.jb51.net/article/60893.htm

下面来看看sort包的简单示例:

type Interface interface {
 // 返回要排序的数据长度
 Len() int
 //比较下标为i和j对应的数据大小,可自己控制升序和降序  
Less(i, j int) bool
 // 交换下标为i,j对应的数据
 Swap(i, j int)
}

任何实现了 sort.Interface 的类型(一般为集合),均可使用该包中的方法进行排序。这些方法要求集合内列出元素的索引为整数。

这里我直接用源码来讲解实现:

1、源码中的例子:

type Person struct {
 Name string
 Age int
}

type ByAge []Person
//实现了sort接口中的三个方法,则可以使用排序方法了
func (a ByAge) Len() int   { return len(a) }
func (a ByAge) Swap(i, j int)  { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age 

<p><strong>2、Sort(data Interface)方法</strong></p>

<pre class="brush:js;">
//sort包只提供了这一个公开的公使用的排序方法,
func Sort(data Interface) {
 // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached.
 //如果元素深度达到2*ceil(lg(n+1))则选用堆排序
 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  1 {
  // Do ShellSort pass with gap 6
  // It could be written in this simplified form cause b-a 


<pre class="brush:js;">
//堆排序
func heapSort(data Interface, a, b int) {
 first := a
 lo := 0
 hi := b - a

 // Build heap with greatest element at top.
 //构建堆结构,最大的元素的顶部,就是构建大根堆
 for i := (hi - 1) / 2; i >= 0; i-- {
  siftDown(data, i, hi, first)
 }

 // Pop elements, largest first, into end of data.
 //把first插入到data的end结尾
 for i := hi - 1; i >= 0; i-- {
  data.Swap(first, first+i) //数据交换
  siftDown(data, lo, i, first) //堆重新筛选
 }
}
// siftDown implements the heap property on data[lo, hi).
// first is an offset into the array where the root of the heap lies.
func siftDown(data Interface, lo, hi, first int) {
 //hi为数组的长度
 //这里有一种做法是把跟元素给取到存下来,但是为了方法更抽象,省掉了这部,取而代之的是在swap的时候进行相互交换
 root := lo //根元素的下标
 for {
  child := 2*root + 1 //左叶子结点下标
  //控制for循环介绍,这种写法更简洁,可以查看我写的堆排序的文章
  if child >= hi { 
   break
  }
  //防止数组下标越界,判断左孩子和右孩子那个大
  if child+1 

<p>这个包中还有很多方法,这个包实现了很多方法,比如排序反转,二分搜索。排序通过 quickSort()这个方法来控制该调用快排还是堆排。</p>
<p><span style="color: #ff0000"><strong>总结</strong></span></p>
<p>今天关于《go语言中sort包的实现方法与应用详解》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!</p>
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go语言程序查看和诊断工具详解Go语言程序查看和诊断工具详解
上一篇
Go语言程序查看和诊断工具详解
Go语言排序算法之插入排序与生成随机数详解
下一篇
Go语言排序算法之插入排序与生成随机数详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3176次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3388次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3417次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4522次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3796次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码