美文网首页
golang版堆排序

golang版堆排序

作者: 027f63d16800 | 来源:发表于2018-01-09 13:40 被阅读326次
    package main
    
    import "fmt"
    
    func main() {
        array := []interface{}{4, 2, 8, 5, 1, 9, 6, 11, 0, 4, 2, 9, 7, 3, 12, 43, 23, 12, 0, 97, 4}
        headSoft(array, func(a, b interface{}) bool {
            a1 := a.(int)
            a2 := b.(int)
            return a1 <= a2
        })
        fmt.Println(array)
    }
    
    func headSoft(array []interface{}, cmp func(a, b interface{}) bool) {
        len := len(array)
        //建堆
        for i := (len / 2) - 1; i >= 0; i-- {
            adjustHeap(array, i, len, cmp)
        }
    
        //排序
        for i := 0; i < len; i++ {
            sz := len - i - 1
            array[0], array[sz] = array[sz], array[0]
            adjustHeap(array[0:sz], 0, sz, cmp)
        }
    }
    
    func adjustHeap(array []interface{}, i, len int, cmp func(a, b interface{}) bool) {
        for ch := i<<1 + 1; ch < len; ch = i<<1 + 1 {
            rg := i<<1 + 2
            if rg < len && cmp(array[ch], array[rg]) {
                ch = rg
            }
            if cmp(array[ch], array[i]) {
                return
            }
            array[ch], array[i] = array[i], array[ch]
            i = ch
        }
    }

相关文章

网友评论

      本文标题:golang版堆排序

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