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个极值

posted @   J0nathan1ei  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示