数据结构十大排序算法之一:堆排序(主要)与树形选择排序(次要)

本文深入解析了堆排序的原理,包括堆的定义、堆排序思想、关键步骤及调整过程。通过实例说明了大根堆和小根堆的区别,以及如何利用它们进行排序。

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


堆排序:


堆的定义:
一个序列R[1…n],关键字分别为k1、k2、… 、kn。
该序列满足如下性质(简称为堆性质):
① ki≤k2i 且ki≤k2i+1 (即结点的左右孩子均大于该节点-----又称最小堆)
或 ② ki≥k2i 且ki≥k2i+1 (1≤i≤ | n/2 |)(即结点的左右孩子均小于该节点-----又称最大堆)
满足第①种情况的堆称为小根堆 ,满足第② 种情况的堆称为大根堆。下面讨论的堆是大根堆。

大根堆 对应的完全二叉树中,任意一个结点的关键字都大于或等于它的孩子结点的关键字。
最小关键字的记录一定是某个叶子结点!!!
在这里插入图片描述
堆排序思想:

  对一组待排序的记录,按堆的定义建立堆;
  将堆顶记录和最后一个记录交换位置,则前n-1个记录是无序的,而最后一个记录是有序的;
  堆顶记录被交换后,前n-1个记录不再是堆,需将前n-1个待排序记录重新组织成为一个堆,
然后将堆顶记录和倒数第二个记录交换位置,即将整个序列中次小关键字值的记录调整(排除)出无序区;
  重复上述步骤,直到全部记录排好序为止。

结论: 排序过程中,若采用小根堆,排序后得到的是递减序列;若采用大根堆,排序后得到的是递增序列。
堆排序的关键:

  如何由一个无序序列建成一个堆?
  如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆? 

堆的调整——筛选:
堆的调整思想:
输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。
输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换; 重复上述操作,直到是叶子结点或其关键字值小于等于左、右子树的关键字的值,将得到新的堆。称这个从堆顶至叶子的调整过程为“筛选”,如图10-10所示。
注意:
筛选过程中,根结点的左、右子树都是堆,因此,筛选是从根结点到某个叶子结点的一次调整过程。
在这里插入图片描述
来看一个例题:
例:设待排序的表有10个记录,其关键字分别为{6,8,7,9,0,1,3,2,4,5}。说明采用堆排序方法进行排序的过程。
排序序列:6,8,7,9,0,1,3,2,4,5
在这里插入图片描述
上面的那个第一次建堆的图形是怎样得到的呢?
下面以图示分解为例:
最大堆的建立过程以及调整过程图系分解:
在这里插入图片描述
最小堆的建立过程以及调整过程图系分解:
在这里插入图片描述
注意:上面的两个图示过程均为老师所讲内容
下面看一下辅助教科书所讲的方法:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


树形选择排序:


借助“ 淘汰赛 ”中的对垒就很容易理解树形选择排序的思想。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值