堆排序原理

今天看了几篇讲堆排序的博客,感觉没有把堆排序的思想讲清楚,现梳理一下思路。

堆的定义

  • 堆是一颗完全二叉树

  • 以最小堆为例:在一颗树中,其根节点的值小于其子树的任意结点的值,这个条件对于这棵树的任意子树也成立,就称这棵树为最小堆。最大堆相反。

  • 我们可以利用数组存储堆,即根节点对应arr[0],其子节点从左至右依次排序。

  • 下图即为一个最小堆(圆圈外为数组索引,圆圈内为值)

圆圈外为数组索引,圆圈内为值

堆排序思想(以升序为例)

  • 若是要以升序排序,我们希望数组中最后一个元素为整个数组中的最大值。那么我们就可以借用堆的构造,因为最大堆中的根节点是整个树中最大的元素。
    第一步:我们可以使用最大堆的构造方法使用数组元素构造出一个最大堆
    第二步:然后将最大堆的根结点与数组中最后一个元素交换位置(此时数组中最后的元素为最大值)
    第三步:忽略最后一个元素,将数组中第一个元素到倒数第二个元素再次构造最大堆
    第四步:将其根节点与数组元素中的倒数第二个元素交换位置(此时数组最后的元素为最大值,倒数第二个元素为次大值)


    最终得到的数组为升序排列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值