go语言堆排序怎么实现
短信预约 -IT技能 免费直播动态提醒
Go语言堆排序的实现步骤如下:
- 首先,定义一个用于进行堆调整的函数
adjustHeap
,该函数接受三个参数:待调整的切片arr
,当前需要调整的节点的下标i
,以及堆的大小length
。 - 在
adjustHeap
函数中,首先获取当前节点的值,然后计算出其左子节点和右子节点的下标。 - 比较左子节点和右子节点的值,取较大值的下标作为
maxIndex
。 - 判断当前节点与其子节点的大小关系,如果当前节点的值小于
maxIndex
所对应的子节点的值,则交换两者的值,并递归调用adjustHeap
函数,以保证堆的性质。 - 在主函数中,首先构建一个初始堆,通过调用
adjustHeap
函数来从最后一个非叶子节点开始进行堆调整。 - 将堆顶元素与最后一个元素交换,然后将堆的大小减一,并调用
adjustHeap
函数对堆顶元素进行调整,以保持堆的性质。 - 重复步骤 6,直到堆的大小为 1,此时,整个序列已经有序。
下面是具体的代码实现:
package main
import "fmt"
func adjustHeap(arr []int, i, length int) {
temp := arr[i]
for k := i*2 + 1; k < length; k = k*2 + 1 {
if k+1 < length && arr[k] < arr[k+1] {
k++
}
if arr[k] > temp {
arr[i] = arr[k]
i = k
} else {
break
}
}
arr[i] = temp
}
func heapSort(arr []int) {
length := len(arr)
for i := length/2 - 1; i >= 0; i-- {
adjustHeap(arr, i, length)
}
for i := length - 1; i > 0; i-- {
arr[0], arr[i] = arr[i], arr[0]
adjustHeap(arr, 0, i)
}
}
func main() {
arr := []int{9, 8, 7, 6, 5, 4, 3, 2, 1}
heapSort(arr)
fmt.Println(arr)
}
输出结果为 [1 2 3 4 5 6 7 8 9]
,表示已经成功对输入的序列进行了堆排序。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341