返回
动画直观掌握 Go 中堆排序算法
后端
2024-01-07 11:51:30
跟着动画学 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)
}
}
总结
堆排序算法在数据结构和算法领域有着广泛的应用。通过理解堆的数据结构和算法原理,并借助动画演示直观地了解算法的运作过程,我们可以轻松掌握堆排序算法,为我们的编程技能锦上添花。