coding A&D:(选择排序)堆排序

【概念】:

堆是具有以下性质的完全二叉树: 

   每个结点的值都大于或等于其左右孩子结点的值,称为大根堆; 

   或者每个结点的值都小于或等于其左右孩子结点的值,称为小根堆。

(注意:这种结构是对父节点-左/右孩子节点之间做的约束,而对左-右孩子节点之间并没有什么要求。千万别错记成二叉排序树的性质)

【排序过程】:(以大根堆为例)

(1)初始化堆:

堆是对父节点-左/右孩子节点之间的约束,所以从最后一个非叶子节点开始调整。
 

(注意每次交换后,都要对下一层的子堆进行递归调整,因为交换后有可能破坏已调整子堆的结构。)
(2)进行调整后,堆顶元素(array[0])为最大值,将最大值与堆尾部元素(array[count-1])交换,并将count值减去1,则此时得到新的无序数组array[count],此时的堆被破坏。

对应到数组元素为:
 

(黄色标记为已排序部分)

(3)调整堆:与建堆过程类似,堆顶元素被一个比较小的值代替,所以从堆顶元素开始调整,在堆顶、堆顶的左孩子、堆顶的右孩子中找出最大的与堆顶进行交换,被交换的元素再次与他下一层的左右孩子进行比较(递归)调整。

(4)重复(2)

过程如下

此时,大概的一个手工过程就懂了,注意的是:初始化堆是基础,时从下向上调整。交换后调整堆时因为有了建堆的基础,每次调整的都是二叉树的一支子树,是从上往下。


初始状态: 12 5 9 36 8 21 7

建堆之后: 36 12 21 5 8 9 7

排序之后: 5 7 8 9 12 21 36

参考来源:https://blog.csdn.net/l577217/article/details/80516654

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值