寻找最小的K个数

同上一篇,使用堆排序的方式做。

第一步构建最小堆,构建好之后数组的第一个元素就是最小的;

第二步排序,开始执行k-1次sift,每次将剩余元素中最小的元素放到未排序元素的末尾

第三步,将数组的后k个数返回即为数组中最小的k个数。

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
33
34
func getLeastNumbers(arr []int, k int) []int {
    if k == 0 {
        return []int{}
    }
    buildMinHeap(arr)
    for i := len(arr) - 1; i > 0; i-- {
        arr[i], arr[0] = arr[0], arr[i]
        siftDown(arr, 0, i)
    }
    return arr[len(arr)-k:]
}
 
func buildMinHeap(arr []int) {
    for i := len(arr)/2 - 1; i >= 0; i-- {
        siftDown(arr, i, len(arr))
    }
}
 
func siftDown(arr []int, idx, size int) {
    left := idx*2 + 1
    right := left + 1
    smallest := idx
 
    if left < size && arr[left] < arr[smallest] {
        smallest = left
    }
    if right < size && arr[right] < arr[smallest] {
        smallest = right
    }
    if smallest != idx {
        arr[smallest], arr[idx] = arr[idx], arr[smallest]
        siftDown(arr, smallest, size)
    }
}

  

posted @   丶Blank  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示