堆排序-golang语言实现
题目链接:力扣912:排序数组
使用数组存储堆,节点之间的索引关系:
本文从数组索引0位置开始存储
若当前节点索引为i
,则父节点
为 (i - 1) / 2
两个子节点
分别为: 2i + 1
, 2i + 2
如下图所示:
堆排序主要有两步:
建堆
排序(本文构建大顶堆,进行升序排序)
(1) 建堆:对于完全混乱的数组,从0开始建堆,只需要从最后一个叶子节点的父节点开始往前遍历,分别执行建堆操作,即可完成堆的构建。如下图所示:
(2) 排序:利用堆进行排序,每次操作将堆顶元素(保存的最大值)和最后一个元素进行交换,并对新的堆的元素进行下沉操作。遍历堆中所有元素,循环上面操作。
排序详细讲解见下方视频链接22:50
func sortArray(nums []int) []int {length := len(nums)// 下沉建堆,从最后一个结点的父节点开始,往前遍历,执行建堆操作for i := (length - 1) / 2; i >= 0; i-- {sink(nums, i, length)}// 排序for k := length - 1; k >= 0 ;k-- { nums[0], nums[k] = nums[k], nums[0]sink(nums, 0, k)}return nums
}func sink(nums []int, i, end int) {for 2 * i <= end {// 获取子节点c1 := 2 * i + 1c2 := 2 * i + 2max := i //默认当前i索引所在结点为最大值// 寻找当前结点和两个子节点中的最大值if c1 < end && nums[i] < nums[c1] {max = c1}if c2 < end && nums[i] < nums[c2] {max = c2}// 交换操作,父节点下沉,与最大的孩子节点交换if max != i { //如果最大值是孩子结点,则进行交换,否则建堆完成,退出nums[max], nums[i] = nums[i], nums[max]} else {break}// 继续下沉i = max}
}
b站视频讲解,非常重要,非常清晰:https://www.bilibili.com/video/BV1Eb41147dK?from=search&seid=6861578783108809808&spm_id_from=333.337.0.0
// 视频中使用的代码为递归,我结合下面代码,使用的是迭代法
https://leetcode-cn.com/problems/sort-an-array/solution/dong-hua-mo-ni-yi-ge-po-dui-pai-wo-gao-l-i6mt/
堆排序-golang语言实现相关推荐
- 算法和数据结构(golang语言实现)
算法和数据结构(golang语言实现) 第1节 选择.冒泡.插入.复杂度 选择排序 选择排序 时间复杂度为O(N^2) 额外空间复杂度O(1) 过程: arr[0-N-1]范围上,找到最小值所在的位置 ...
- log包在Golang语言的标准库中是怎么使用的?
Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...
- 语言与golang语言运行速度_Golang语言情怀第3期 Go 语言数据类型
本期给大家聊下Go语言的数据类型有哪些,数据类型用于声明函数和变量.数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言 ...
- golang语言编译的二进制可执行文件为什么比 C 语言大(转载)
最近一位朋友问我"为什么同样的hello world 入门程序"为什么golang编译出来的二进制文件,比 C 大,而且大很多.我做了个测试,来分析这个问题.C 语言的hello ...
- golang语言操作文件
golang语言操作文件的示例 https://colobu.com/2016/10/12/go-file-operations/#more
- hbase rest api接口链接管理【golang语言版】
# go-hbase-rest hbase rest api接口链接管理[golang语言版] 关于hbase的rest接口的详细信息可以到官网查看[http://hbase.apache.org/b ...
- 语言与golang语言运行速度_Golang语言情怀第13期 Go 语言设计模式 介绍
设计模式是什么 俗话说:站在别人的肩膀上,我们会看得更远.设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于 ...
- GoLang语言多版本管理工具--GVM入门介绍
GoLang语言多版本管理工具--GVM入门介绍 GVM 由Josh Bussdieker(jbuss,jaja,jbussdieker)在Moovweb工作期间 GVM提供了一个管理Go版本的界面. ...
- 记录一次游戏服务器的压测调优记录(Golang语言)
记录一次游戏服务器的压测调优记录(Golang语言) 来自:烧书煮石_ 记录一次游戏服务器的压测调优记录(Golang语言) - 简书 (jianshu.com) 前言 辛苦开发了一年的服务,终于要上 ...
最新文章
- 「屋漏偏逢连夜雨」,Log4j 漏洞还没忙完,新的又来了
- 根据下拉框生成控件列表
- DUILib 中的通知事件
- Effective java -- 2 对于所有对象都通用到方法
- HDU-Yuna's confusion 树状数组 Or Multiset
- jax-ws和jax-rs_使用JAX-RS和Jetty创建Web服务和Rest Server
- 字符串匹配——RabinKarp算法
- 世界地球日:全国网友用手机种出“保护黄河幸福林”
- Xshell、Xftp免费版获取教程
- 如何将Adobe Photoshop(PS)完全卸载
- Python绘制气象风场
- 工业相机(高速相机)与普通相机的差别
- switch()的参数类型
- 三分钟部署Laxcus大数据管理系统
- android 各个版本的发布时间和信息
- Machine Learning in Action(5) SVM算法
- keil建立stm32工程即标准库函数目录结构
- PaddlePaddle测试模型报Intel MKL function load error: cpu specific dynamic library is not loaded.
- 4g+uim卡是什么卡_为什么电信4G信号满格网速却很慢?
- vue 生成二维码 并 可以下载带有边框背景颜色的二维码
热门文章
- ME51N-提醒要货源清单(根本没√货源确定)
- java socket发送定长报文_定长消息报文的组包与解包简单封装(Java实现)
- 聪颖少年——李耳少年求学好问爱思考的故事:写出流传千古的《道德经》的老子...
- 【已解决】win10系统使用耳机时左右音量不同
- Win11麦克风权限的开启方法
- ffmpeg编译android平台-(ubuntu+ndkr16b+ffmpeg3.4.12)
- java-五十七天---深度剖析java核心技术(微服务、CAP帽子理论、配置中的超时和重试、RPC原理、序列化、注意)
- 各种软件版本号的含义
- SSM毕设项目农产品交易平台9o9p3(java+VUE+Mybatis+Maven+Mysql)
- iOS-获取手机唯一标识符(获取苹果手机IMEI,获取苹果手机MAC)