美文网首页
golang版 堆排序

golang版 堆排序

作者: Rohn | 来源:发表于2022-05-05 16:41 被阅读0次

    核心代码

    package lib
    
    var nums []int
    
    func HeapSort(numsArray []int) []int {
    
        nums = numsArray
        heapSize := len(nums)
        for heapSize > 1 {
            //建堆空间
            buildHeep(heapSize)
            //交换排序后的堆顶和最后一个堆元素
            swap(&nums[0], &nums[heapSize-1])
            //堆空间减1
            heapSize--
        }
        return nums
    }
    
    func swap(a, b *int) {
        *a, *b = *b, *a
    }
    
    func buildHeep(len int) {
        // 找到最后一个节点的父节点
        parent := len/2 - 1
        for parent >= 0 {
            heapify(parent, len)
            parent--
        }
    }
    
    func heapify(parent, len int) {
        // 判断两个子节点是否比父节点大,如果子节点大则交换子节点和父节点
        max := parent
        lson := parent*2 + 1
        rson := parent*2 + 2
        if lson < len && nums[lson] > nums[max] {
            // 左节点是否大于父节点
            max = lson
        }
        if rson < len && nums[rson] > nums[max] {
            // 右节点是否大于父节点
            max = rson
        }
        if parent != max {
            swap(&nums[max], &nums[parent])
            heapify(max, len)
        }
    }
    

    调用入口

    package main
    
    import (
        "fmt"
        "test/lib"
    )
    
    func main() {
    
        fmt.Println(lib.HeapSort([]int{
            4, 3, 5, 0, 8, 6, 7,
        }))
    }
    

    相关文章

      网友评论

          本文标题:golang版 堆排序

          本文链接:https://www.haomeiwen.com/subject/gfcoyrtx.html