数组中第K大问题之堆排序

这次在刷Leetcode时,在求解数组中的第K大问题时,想到了使用堆排序,因此本篇文章用于巩固对堆排序的学习以及代码实现。

题目描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

输入:[3,2,3,1,2,4,5,5,6] 和 k = 4

输出:4

当时看到此题时,第一反应就是想到使用大顶堆来求解,在第K次调堆后,就能够得到最K大元素。后续以大顶堆进行为例。

先来简单回顾堆排序:堆是一棵完全二叉树。如果是一个大顶堆,则根节点递归的大于其左右孩子节点的值。

以大顶堆为例:(3,2,3,1,2,4,5,5,6),对该待排序列进行堆排序。

首先,将该序列建立一棵完全二叉树。(这里可以假定建立完全二叉树,可以以数组的位序模拟对二叉树的操作)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVF0v7eg-1617346223986)(https://s3.ax1x.com/2021/03/18/6g268x.png)]

从第一个(从右向左,从下向上看起)非叶子节点为根节点的子树开始,将其调整为大根堆。因为6>5,所以6和1进行交换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvD31FJ6-1617346223989)(https://s3.ax1x.com/2021/03/18/6g2c26.png)]

开始调整第二个非叶子节点作为根节点的子树,这里第二个非叶子节点为3。因为5>4,所以根节点3和5进行交换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZOMqEST0-1617346223990)(https://s3.ax1x.com/2021/03/18/6g2r5R.png)]

接下来,来到非叶节点2,因为 6 > 2,所以根节点2与6进行交换。此时,该子树因为根的调整,以2为根节点的子树不满足大顶堆的性质,因此需要递归的调整子树,将5和2进行调换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1o1MWD4-1617346223992)(https://s3.ax1x.com/2021/03/18/6g2Da9.png)]

此时来到最后一个非叶节点,即根节点。因为6 > 5,所以3和6进行调换,同时需要递归修改此时以3为根节点的子树进行调整为大顶堆。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XRGPuiwu-1617346223993)(https://s3.ax1x.com/2021/03/18/6g2BVJ.png)]

至此,最后得到的一个二叉树就为大顶堆,每个节点的值都大于其左右子树的值。其中,根节点为最大值,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值