核心代码

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  nums[max] {
        // 左节点是否大于父节点
        max = lson
    }
    if 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,
    }))
}
由于版权原因,本站共享资源只供云盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件并发送到[email protected]告知,我们会在收到邮件后72小时内删除。
想开点 » golang版 堆排序