返回

动画直观掌握 Go 中堆排序算法

后端

跟着动画学 Go 数据结构之堆排序

堆排序作为一种树形选择排序算法,因其选择最小的记录时间复杂度为 O(nlogn) 而备受青睐。与简单选择排序算法每次需要 O(n) 的时间相比,堆排序在效率上具有显著优势。

理解堆排序算法的关键在于理解堆数据结构。堆可以看作一棵完全二叉树,其中每个结点的值都大于或等于其子结点的值。这种结构允许我们通过快速调整,将关键字最小的记录移动到堆的根部,从而实现排序。

动画演示

要直观地理解堆排序算法,不妨跟随以下动画演示:

[动画演示链接]

在这个动画中,我们首先构建一个堆,然后通过不断地将根结点与最右子结点交换并重新调整堆的结构,将关键字最小的记录移动到堆的根部。重复这一过程,直到所有记录都排好序。

Go 代码实现

在 Go 语言中,我们可以使用以下代码实现堆排序算法:

package main

import (
    "fmt"
)

func main() {
    arr := []int{5, 2, 8, 3, 1, 9, 4, 7, 6}
    fmt.Println("排序前:", arr)

    heapSort(arr)

    fmt.Println("排序后:", arr)
}

func heapSort(arr []int) {
    // 构建堆
    for i := len(arr)/2 - 1; i >= 0; i-- {
        heapify(arr, i, len(arr))
    }

    // 排序
    for i := len(arr) - 1; i > 0; i-- {
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, 0, i)
    }
}

func heapify(arr []int, root, size int) {
    largest := root
    left := 2*root + 1
    right := 2*root + 2

    if left < size && arr[left] > arr[largest] {
        largest = left
    }

    if right < size && arr[right] > arr[largest] {
        largest = right
    }

    if largest != root {
        arr[root], arr[largest] = arr[largest], arr[root]
        heapify(arr, largest, size)
    }
}

总结

堆排序算法在数据结构和算法领域有着广泛的应用。通过理解堆的数据结构和算法原理,并借助动画演示直观地了解算法的运作过程,我们可以轻松掌握堆排序算法,为我们的编程技能锦上添花。