美文网首页
Go-堆排序

Go-堆排序

作者: KN郑某某 | 来源:发表于2019-08-29 17:03 被阅读0次

    堆排序

    • 算法实现
    func sift(list []int, left, right int) {
        fIdx := left
        sIdx := fIdx*2 + 1
        // 构造大根堆
        for sIdx <= right {
            //判断左孩子:sIdx 右孩子:sIdx+1
            if sIdx < right && list[sIdx] < list[sIdx+1] {
                sIdx++
            }
            // 最终和大的儿子比较
            if list[fIdx] < list[sIdx] {
                // 交换
                list[fIdx], list[sIdx] = list[sIdx], list[fIdx]
                // 交换后重新检查被修改的子节点为大根堆
                fIdx = sIdx
                sIdx = 2*fIdx + 1
            } else {
                // 已经是大根堆
                break
            }
        }
    }
    
    func HeapSort(list []int) {
        length := len(list)
        //建立初始堆
        sift(list, 0, length-1)
        for idx := length / 2; idx >= 0; idx-- {
            // 从后往前调整
            sift(list, idx, length-1)
        }
        // 将大根堆的根节点和堆最后一个元素交换,重新对前面的 length - 1 调整堆
        for idx := length - 1; idx >= 1; idx-- {
            list[0], list[idx] = list[idx], list[0]
            sift(list, 0, idx-1)
        }
        // 结果就是逆序输出大根堆
    }
    
    • 测试代码
    func main() {
        list := []int{8, 4, 8, 2, 9, 10, -3, 3, 20, 15, -1}
        function.HeapSort(list)
        fmt.Println(list)
    }
    
    • 排序结果

    [-3 -1 2 3 4 8 8 9 10 15 20]

    • 时间复杂度

    O (nlgn)

    相关文章

      网友评论

          本文标题:Go-堆排序

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