堆排序及调整算法详解
创作时间:
作者:
@小白创作中心
堆排序及调整算法详解
引用
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),是一种高效的排序算法。
热门推荐
国考申论作文评分标准详解:从一类文到四类文的全方位解析
合同续签相关条款解析与注意事项
Cell子刊:上海体育大学郭亮团队揭示运动预防和改善脂肪肝的新机制
怎么能降低肌酐值
ROE怎么算?详解净资产收益率的计算与应用
水彩画的色彩表现分析与情感表达实践
什么药物能够替代他汀?
谢安及其家族成员的历史考察
哈尔滨眼科专科排名概览:2025年哈尔滨眼科医院专科评价榜单前列全览
硕士考公务员定级及职位解析
如何选择适合的可控硅型号?
小儿惊风是什么病症
怎样降低谷氨酰转肽酶
头像真的能反映一个人的性格吗?
如何合理计算超支比例并进行有效控制?这种计算方法有哪些适用范围?
《小巷人家》:父母和睦是孩子最大的底气
什么是教育的底线,如何坚守教育的底线?
继承权公证与继承公证的对比分析
汽车钥匙没电怎么办?四种实用解决方案帮你轻松启动车辆
超声波清洗机洗牙套的最佳选择及注意事项
智能育种解决方案:推动现代农业变革的新动力
清远石角沙滩游玩攻略:北江河畔纳凉避暑,尽享阳光沙滩与草原风光
鼻塞喉咙疼时,这些药物怎么选?
香槟酒要醒酒吗?香槟的饮用方法和注意事项
手机APP开发有哪些注意事项
光照度计的单位是什么 照度计计算方法是什么
中考体育测试必看:800米/1000米中长跑训练技巧全攻略
楼道灯电费谁负责?物业管理范围全解析
拒绝摆烂!这些RPG游戏带你开启异世界狂飙
尝鲜!乌鲁木齐市第一中学(河马泉校区)Deepseek进课堂试水AI融合教学