题目链接:力扣912:排序数组

使用数组存储堆,节点之间的索引关系:
本文从数组索引0位置开始存储
若当前节点索引为i,则父节点(i - 1) / 2
两个子节点分别为: 2i + 12i + 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语言实现相关推荐

  1. 算法和数据结构(golang语言实现)

    算法和数据结构(golang语言实现) 第1节 选择.冒泡.插入.复杂度 选择排序 选择排序 时间复杂度为O(N^2) 额外空间复杂度O(1) 过程: arr[0-N-1]范围上,找到最小值所在的位置 ...

  2. log包在Golang语言的标准库中是怎么使用的?

    Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...

  3. 语言与golang语言运行速度_Golang语言情怀第3期 Go 语言数据类型

    本期给大家聊下Go语言的数据类型有哪些,数据类型用于声明函数和变量.数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言 ...

  4. golang语言编译的二进制可执行文件为什么比 C 语言大(转载)

    最近一位朋友问我"为什么同样的hello world 入门程序"为什么golang编译出来的二进制文件,比 C 大,而且大很多.我做了个测试,来分析这个问题.C 语言的hello ...

  5. golang语言操作文件

    golang语言操作文件的示例 https://colobu.com/2016/10/12/go-file-operations/#more

  6. hbase rest api接口链接管理【golang语言版】

    # go-hbase-rest hbase rest api接口链接管理[golang语言版] 关于hbase的rest接口的详细信息可以到官网查看[http://hbase.apache.org/b ...

  7. 语言与golang语言运行速度_Golang语言情怀第13期 Go 语言设计模式 介绍

    设计模式是什么 俗话说:站在别人的肩膀上,我们会看得更远.设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于 ...

  8. GoLang语言多版本管理工具--GVM入门介绍

    GoLang语言多版本管理工具--GVM入门介绍 GVM 由Josh Bussdieker(jbuss,jaja,jbussdieker)在Moovweb工作期间 GVM提供了一个管理Go版本的界面. ...

  9. 记录一次游戏服务器的压测调优记录(Golang语言)

    记录一次游戏服务器的压测调优记录(Golang语言) 来自:烧书煮石_ 记录一次游戏服务器的压测调优记录(Golang语言) - 简书 (jianshu.com) 前言 辛苦开发了一年的服务,终于要上 ...

最新文章

  1. 「屋漏偏逢连夜雨」,Log4j 漏洞还没忙完,新的又来了
  2. 根据下拉框生成控件列表
  3. DUILib 中的通知事件
  4. Effective java -- 2 对于所有对象都通用到方法
  5. HDU-Yuna's confusion 树状数组 Or Multiset
  6. jax-ws和jax-rs_使用JAX-RS和Jetty创建Web服务和Rest Server
  7. 字符串匹配——RabinKarp算法
  8. 世界地球日:全国网友用手机种出“保护黄河幸福林”
  9. Xshell、Xftp免费版获取教程
  10. 如何将Adobe Photoshop(PS)完全卸载
  11. Python绘制气象风场
  12. 工业相机(高速相机)与普通相机的差别
  13. switch()的参数类型
  14. 三分钟部署Laxcus大数据管理系统
  15. android 各个版本的发布时间和信息
  16. Machine Learning in Action(5) SVM算法
  17. keil建立stm32工程即标准库函数目录结构
  18. PaddlePaddle测试模型报Intel MKL function load error: cpu specific dynamic library is not loaded.
  19. 4g+uim卡是什么卡_为什么电信4G信号满格网速却很慢?
  20. vue 生成二维码 并 可以下载带有边框背景颜色的二维码

热门文章

  1. ME51N-提醒要货源清单(根本没√货源确定)
  2. java socket发送定长报文_定长消息报文的组包与解包简单封装(Java实现)
  3. 聪颖少年——李耳少年求学好问爱思考的故事:写出流传千古的《道德经》的老子...
  4. 【已解决】win10系统使用耳机时左右音量不同
  5. Win11麦克风权限的开启方法
  6. ffmpeg编译android平台-(ubuntu+ndkr16b+ffmpeg3.4.12)
  7. java-五十七天---深度剖析java核心技术(微服务、CAP帽子理论、配置中的超时和重试、RPC原理、序列化、注意)
  8. 各种软件版本号的含义
  9. SSM毕设项目农产品交易平台9o9p3(java+VUE+Mybatis+Maven+Mysql)
  10. iOS-获取手机唯一标识符(获取苹果手机IMEI,获取苹果手机MAC)