美文网首页
堆排序(go实现)

堆排序(go实现)

作者: pengtoxen | 来源:发表于2019-06-19 09:42 被阅读0次
    package main
    
    import "fmt"
    
    //初始化堆
    var arr = []int{0, 10, 100, 2, 45, 95, 1, 5, 8888}
    
    //初始化堆
    func initHeap(arr []int, n int) {
        for i := n / 2; i >= 1; i-- {
            heapify(arr, n, i)
        }
    }
    
    //堆化
    func heapify(heap []int, n int, i int) {
        for {
            maxPos := i
            //比左边的子元素大
            if i*2 <= n && heap[i] < heap[i*2] {
                maxPos = i * 2
            }
            //比右边的子元素大
            if i*2+1 <= n && heap[maxPos] < heap[i*2+1] {
                maxPos = i*2 + 1
            }
            //maxPos == i 说明比左右子元素都小,跳出循环
            if maxPos == i {
                break
            }
            //交换父元素和子元素的值
            heap[i], heap[maxPos] = heap[maxPos], heap[i]
            i = maxPos
        }
    }
    
    //堆排序
    func sort(arr []int) {
        n := len(arr) - 1
        initHeap(arr, n)
        k := n
        for k > 1 {
            arr[1], arr[k] = arr[k], arr[1]
            k--
            heapify(arr, k, 1)
        }
    }
    
    func main() {
        sort(arr)
        fmt.Println(arr)
    }
    

    相关文章

      网友评论

          本文标题:堆排序(go实现)

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