今天用go写个堆排

func heapSort(arr []int) {
n := len(arr)

// 构建最大堆
for i := n/2 - 1; i >= 0; i-- {
heapify(arr, n, i)
}

// 一个一个从堆中取出元素
for i := n - 1; i > 0; i-- {
// 将当前根节点与末尾元素交换
arr[0], arr[i] = arr[i], arr[0]

// 在减少的堆上执行堆化操作
heapify(arr, i, 0)
}
}

func heapify(arr []int, n, i int) {
largest := i // 当前节点作为最大元素
left := 2*i + 1 // 左子节点索引
right := 2*i + 2 // 右子节点索引

// 如果左子节点大于根节点
if left < n && arr[left] > arr[largest] {
largest = left
}

// 如果右子节点大于当前最大节点
if right < n && arr[right] > arr[largest] {
largest = right
}

// 如果最大值不是根节点
if largest != i {
// 交换根节点和最大值
arr[i], arr[largest] = arr[largest], arr[i]

// 递归地对堆子树进行堆化
heapify(arr, n, largest)
}
}

func main() {
arr := []int{12, 11, 13, 5, 6, 7}
fmt.Println("排序前:", arr)

heapSort(arr)

fmt.Println("排序后:", arr)
}
展开
评论