Golang实现堆排序

堆排序是一种基于堆数据结构的排序算法,它通过构建近似完全二叉树的堆,然后进行调整来实现排序。本文介绍了堆排序的定义、堆节点的访问方式、时间复杂度,并给出了Golang实现和测试部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆节点的访问

通常堆是通过一维数组来实现的。在数组起始位置为0的情形中:

父节点i的左子节点在位置 (2i+1);
父节点i的右子节点在位置 (2i+2);
子节点i的父节点在位置 floor((i-1)/2);

时间复杂度

wiki

实现

// HeapSort
package main

import (
	"fmt"
)
func maxHeap(start int, end int, c []int) {
	var root = start
	for true {
		var child = 2*root + 1
		if child > end {
			break

		}
		if child+1 <= end && c[child] < c[child+1] {
			child += 1
		}
		if c[root] < c[child] {
			c[root], c[child] = c[child], c[root]
			root = child
		} else {
			break
		}
	}
	return

}

func heapSort(c []int) []int {
	var n = len(c)

	for start := n / 2; start >= 0; start-- {
		maxHeap(start, n-1, c)
	}
	for end := n - 1; end > 0; end-- {
		c[0], c[end] = c[end], c[0]
		maxHeap(0, end-1, c)
	}
	return c

}

测试

//test
func main() {
	var b = []int{9, 8, 6, 7, 4, 3, 2, 1}

	fmt.Println(heapSort(b))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值