堆排序

本文深入解析堆排序的基本概念、操作流程及时间复杂度,通过LeetCode215题实战,展示如何利用堆排序求解无序数组中的第k大元素。详细介绍了创建最大堆、最大堆调整及堆排序的全过程。

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

在做leet code 215. Kth Largest Element in an Array。
要求输出一个无序数组的第k大的元素。
可用堆排序求解。
于是复习了一下堆排序的相关知识,如下:

堆排序
**1 堆的定义:**近似完全二叉树的结构。子节点的键值总是大于(或小于)它的父节点。
以大顶堆为例,最大值总是位于根节点。堆是二叉树结构,也可以用数组表示,即逐层遍历元素的顺序。

2 堆的操作
堆中定义以下几种操作:
最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(Build Max Heap):将堆中的所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

下面来梳理一下创建最大堆(Build Max Heap)的过程。
对二叉树:
for node in 所有非叶节点(顺序为从下往上,从右往左):
比较node和node的子节点中较大的一个
if node.val < child.val:
交换node和child,并继续比较node和新位置的children,直到位置不再移动。
如上处理完所有非叶节点后,则堆构建完成。

下面梳理最大堆调整:
如果已经完成堆的构建,仅仅变更了根节点。
则按照创建堆时对非叶节点的操作,移动根节点直到正确的位置即可。

下面梳理堆排序的过程:
a)将根节点与最后一个节点交换。(则根节点归于已经完成排序)
b)对剩下的元素进行最大堆调整。
c)重复a,b,直到所有节点有序。

3 其他

  • 堆排序的时间复杂度为O(N*logN),即每个节点调整时需要比较的次数为O(logN)
  • 堆的存储可以用数组,第i个节点的父节点为(i-1)/2. 第i个节点的子节点为i2 + 1, i2 + 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值