Golang实现堆排序
堆排序的原理是,利用堆数据结构,通过比较,逐步交换父节点、子节点的数值,每次筛选出一个子堆的最值,遍历完数组的所有子堆,最终得到一个有序序列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | func adjustHeap(nums []int, parent, end int) { child := parent*2 + 1 for child < end { if child+1 < end && nums[child+1] > nums[child] { child++ } if nums[parent] > nums[child] { return } nums[parent], nums[child] = nums[child], nums[parent] parent = child child = child*2 + 1 } } func buildHeap(nums []int) { length := len(nums) for parent := length/2 - 1; parent >= 0; parent-- { adjustHeap(nums, parent, length) } } func heapSort(nums []int) { buildHeap(nums) for i := len(nums) - 1; i > 0; i-- { nums[0], nums[i] = nums[i], nums[0] // 与末尾元素交换 adjustHeap(nums, 0, i-1) // 调整之前的序列 } } |
由于每次可以求出一个子堆的最值,因此堆排序十分适用于在大数据中,寻找前n个极值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现