堆排序&利用数组可以存储堆结构的特性排序

推排序算法

  1. 把数组当作一个堆结构(最小堆)

  2. 从最后非叶子节点开始向上遍历

  3. 比较父节点值 与 左右孩子节点

  4. 然后调整堆,把左右孩子中最小值 与父节点交换

  5. 遍历直到堆顶,得到最小值

  6. 把堆顶与数组最后一个元素交换,待处理的数组下标左移一位,继续执行3步骤

  7. package main
    
    import "fmt"
    
    /**
    堆排序
    */
    func heapSort(arr []int) {
    	for i := len(arr); i > 0; i-- {
    		//1.找到最小节点值,并把最小节点赋值给0元素
    		findHeapMin(arr, i)
    		//2.头节点与尾节点交换,并将数组指针左移一位
    		arr[0], arr[i-1] = arr[i-1], arr[0]
    	}
    }
    
    func findHeapMin(arr []int, length int) {
    	if length < 2 {
    		return
    	}
    
    	//从最后非叶子节点开始遍历
    	for i := len(arr)/2 - 1; i >= 0; i-- {
    		//假设当前节点最小值
    		topMin := i
    		//左孩子
    		leftIndex := i*2 + 1
    		//又孩子
    		rightIndex := i*2 + 2
    		//左孩子存在,且小于父节点
    		if leftIndex < length && arr[leftIndex] < arr[topMin] {
    			topMin = leftIndex
    		}
    		//右孩子存在,且小于父节点
    		if rightIndex < length && arr[rightIndex] < arr[topMin] {
    			topMin = rightIndex
    		}
    		arr[i], arr[topMin] = arr[topMin], arr[i]
    	}
    }
    
    func main() {
    	data := []int{1, 3, 2, 4, 5, 41, 21, 51, 6, 61, 3, 9, 8, 31}
    	fmt.Printf("原始数组:%v\n", data)
    	heapSort(data)
    	fmt.Printf("堆排序后:%v\n", data)
    
    	/**
    	原始数组:[1 3 2 4 5 41 21 51 6 61 3 9 8 31]
    	堆排序后:[61 51 41 31 21 9 8 6 5 4 3 3 2 1]
    
    	*/
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小哥(xpc)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值