堆排序及调整算法详解
创作时间:
作者:
@小白创作中心
堆排序及调整算法详解
引用
CSDN
1.
https://blog.csdn.net/2301_77479435/article/details/137403664
堆排序是一种基于二叉堆的排序算法,其核心思想是通过构建最大堆(大顶堆)或最小堆(小顶堆)来实现排序。堆排序的时间复杂度为O(nlogn),是一种高效的排序算法。本文将详细介绍堆排序的基本原理以及相关的调整算法。
调整算法
向上调整
向上调整算法用于维护堆的性质,确保父节点的值大于或等于其子节点的值(对于最大堆)。以下是向上调整的具体实现:
void adjust_up(int* a, int child)
{
int parent = (child - 1) / 2;
while (child > 0)
{
if (a[child] > a[parent])
{
swap(a[child], a[parent]);
child = parent;
parent = (child - 1) / 2;
}
else//默认是大堆
{
break;
}
}
}
向下调整
向下调整算法假设左右子树已经是堆,然后调整当前节点及其子树以保持堆的性质。以下是向下调整的具体实现:
void adjust_down(int* a, int n, int root)
{
int parent = root;
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n && a[child + 1] > a[child])//在不是满二叉树的情况下,可能出现只有左孩子没有右孩子
{
child++;
}
if (a[parent] < a[child])
{
swap(a[parent], a[child]);
parent = child;
child = parent * 2 + 1;
}
else//已经是小堆的情况下,如果左右孩子中小的那个比父亲大,则跳出循环
{
break;
}
}
}
堆排序
堆排序的核心思想是通过构建最大堆(大顶堆)来实现排序。具体步骤如下:
- 构建最大堆:从最后一个非叶子节点开始,依次对每个节点进行向下调整,直到根节点。
- 排序:将堆顶元素(最大值)与最后一个元素交换,然后对剩余元素重新构建最大堆,重复此过程直到排序完成。
以下是堆排序的具体实现:
void heap_sort(int* a, int n)
{
for (int i = (n - 1 - 1) / 2; i >= 0; --i)
{
adjust_down(a, n, i);
}
int end = n - 1;
while (end > 0)
{
swap(a[0], a[end]);
adjust_down(a, end, 0);
--end;
}
}
通过以上步骤,可以实现对数组的升序排序。堆排序算法的时间复杂度为O(nlogn),是一种高效的排序算法。
热门推荐
初中生的视力矫正之旅:戴镜3年VS夜间佩戴8小时,OK镜重塑睛彩
图书角精细化管理项目全解析
从中国古诗词中汲取灵感为宝宝起的名字
数字人视频要标注ai制作吗
梅塞施密特传奇:战机之王Bf 109背后的故事
卡通人物形象:塑造与影响深度解析
解决网络延迟的小技巧(优化网络连接)
需求分析中常用Y模型思维
喝醋降血压的正确方法
八字命理:如何确定格局?
中国古典神话中的《道诡异仙》,克苏鲁元素满满,充满了中式恐怖
支原体肺炎用什么药好得快
斯洛特神奇换人背后,利物浦替补阵容成英超最强,瓜迪奥拉也羡慕
前端输入框较多如何设计
AI新闻创作全攻略:掌握高效写作技巧与方法,全面提升内容质量与传播效果
烧尾宴:唐朝盛宴的文化印记
葫芦五帝钱不能乱挂,正确方法助你招财进宝
谈判专家:刘青云、吴镇宇携手众星,演绎警察内部诈骗阴谋
如何查看Steam上的游戏更新日志?
东方市八大特色美食,让你的味蕾尽享当地独特风味
道家看相测命格分析法详解:如何通过道家哲学解读面相与命理
坎高犬和野狼的杂交体:到底是坎高犬出了轨,还是野狼劈了腿?
贵州外包行业未来可期
莫比乌斯环与金属的无限回转:艺术与技术的交汇
海水为何不能直接饮用?两个瓶子竟能将海水转化为淡水,原理揭秘
三门问题的数学原理及Matlab模拟实验
AI大模型能否突破算力瓶颈?业内专家展望“超智融合”
梦幻西游:129级通刷任务的组合推出,向固伤阵容说再见!
八字偏印的用法:从性格分析到职业规划的全面解读
一文看懂!固态电池、半固态电池以及全固态电池的区别