最小堆的特点是其父节点的值不大于任何一个字节点的值, 实现的是升序排序。
最小堆实现排序的原理,构建一个堆,不断的删除堆顶,这里的删除并不是完全删除,
而是将堆顶移动到末尾,然后父节点开始下沉操作,最后成为一个有序序列。

代码如下:

package main

import "fmt"

func buidHeap(a []int, n int) {

    //heapify from the last parent node
    for i := n / 2; i >= 1; i-- {
        heapifyUpToDown(a, i, n)
    }

}

// 排序索引从1开始的n个元素, 索引为0的元素不参与排序
func sort(a []int, n int) {
    buidHeap(a, n)

    k := n
    for k >= 1 { // 堆顶移动到最后, 节点进行下沉操作
        a[1], a[k] = a[k], a[1]
        heapifyUpToDown(a, 1, k-1)
        k--
    }
}

// 节点下城
func heapifyUpToDown(a []int, top int, count int) {

    for i := top; i <= count/2; {

        maxIndex := i
        if a[i] < a[i*2] {
            maxIndex = i * 2
        }

        if i*2+1 <= count && a[maxIndex] < a[i*2+1] {
            maxIndex = i*2 + 1
        }

        if maxIndex == i {
            break
        }

        a[i], a[maxIndex] = a[maxIndex], a[i]
        i = maxIndex
    }

}


func main() {
    // 二叉堆排序索引从1开始的n个元素, 数组中的0不参与排序
    arr := []int{0, 2,4,6,8,1, 11}
    sort(arr, len(arr)-1)
    fmt.Print(arr[1:])
}