排序算法 | 堆排序,算法的图解、实现、复杂度和稳定性分析

本文详细介绍了堆排序算法,包括堆的定义、堆排序的思路、代码实现、堆的操作(删除和插入)、特点以及性能分析。堆排序是一种不稳定的排序方法,时间复杂度为O(nlog2n),适用于大量数据的升序或降序排列。
  • 今天讲解一下堆排序的原理以及实现、复杂度和稳定性分析

在这里插入图片描述


1 堆的定义

堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

定义:
n个关键字序列L[1…n]称为堆,当且仅当该序列满足:

① L(i)>=L(2i) 且 L(i)>=L(2i+1)或

② L(i)<=L(2i) 且 L(i)<=L(2i+1) (1≤isln/2])

可以将该一维数组视为一棵完全二叉树

这里是引用

大根堆:满足条件① 的堆称为大根堆(大顶堆),大根堆的最大元素存放在结点,且其任一非根结点的值小于等于其双亲结点值

在这里插入图片描述

对于堆中的元素编号,其实也是逻辑结构映射到数组的一个过程;

小根堆:满足条件2的堆称为小根堆(小顶堆),小根堆的定义刚好相反,结点是最小元素

这里是引用

2 堆排序的思路

首先将存放在L[1…n]中的n个元素建成初始堆,由于堆本身的特点(以大顶堆为例),堆顶元素就是最大值。
输出堆顶元素后,通常将堆底元素送入堆顶,堆被破坏,将堆顶元素向下调整使其继续保持大顶堆的性质,再输出堆顶元素。如此重复。

  • 根据数组构建一个完全二叉树
  • 从最后一个非叶节点开始调整,使得子树成为堆
  • 如此重复,直至满足堆的定义

值得注意的是:

大根堆排序结果为升序

小根堆排序结果为降序

这是一个常见的误区!

这是因为:堆使用的时候都是每次把堆顶的元素干掉留下堆内部的元素做成Top N

如果你要找100000中的 TOP100最大的,你用小根堆

如果你要找100000中的 TOP100最小的,你用大根堆

3 代码实现

void BuildMaxHeap(int *arr
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值