排序-堆排序(golang版)

本文介绍了堆排序的原理,通过图解展示了堆排序的过程。堆排序是一种选择排序,通过构建最大(或最小)堆来找到序列中的最大(或最小)元素。代码示例展示了如何在Go语言中实现堆排序,包括建堆和调整堆的过程。

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

  • 首先堆排序的思想请看图解排序算法(三)之堆排序,写的很清晰
  • 注意节点 i 的两个子节点下标分别为 2i+1 和 2i+2
  • 建堆开始节点应为最后一个非叶子节点,即 length/2 - 1 ,然后循环处理所有非叶子节点
  • 代码
package main

import (
	"fmt"
)

func heap(list []int){
	len := len(list)
	//将最值放到切片末尾,然后参与建堆的list的长度少一个,处理到需要建堆的list的长度为1为止
	for i:=len; i>0; i-- {
		buildHeap(list[:i])
		//将最值放到末尾
		list[0],list[i-1] = list[i-1],list[0]
	}
}

func buildHeap(list []int){
	len := len(list)
	//建堆开始节点应为最后一个非叶子节点,即 length/2 - 1 ,然后循环处理所有非叶子节点
	for i:=len/2-1; i>=0; i-- {
		//比较左子节点
		if 2*i+1 < len && list[i] > list[2*i+1] {
			list[i], list[2*i+1] = list[2*i+1], list[i]
		}
		//比较右子节点
		if 2*i+2 < len && list[i] > list[2*i+2] {
			list[i], list[2*i+2] = list[2*i+2], list[i]
		}
	}
}


func main() {
	var list = []int{2,1,4,5,3,9,8,7,6}
	heap(list)
	fmt.Println(list)
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值