堆排序及调整算法详解
创作时间:
作者:
@小白创作中心
堆排序及调整算法详解
引用
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),是一种高效的排序算法。
热门推荐
葡萄中的抗氧化秘密:防癌又护心!
秋冬养生新宠:葡萄中的白藜芦醇
吃葡萄不吐葡萄皮?巨峰、玫瑰香、无籽露教你养生新姿势!
元旦自驾游打卡:桂林山水不可错过!
自制开心果闪电泡芙,甜品界的网红新宠!
新疆种植开心果的绝招大揭秘!
白壳VS黄壳开心果:哪个更值得买?
冬游湖州:八都岕银杏长廊打卡攻略
花青素对人体有什么好处
血橙的功效与作用、禁忌和食用方法
血橙的功效与食用指南:从营养成分到健康益处
血橙没有血,我是不是买到了假血橙?
跟着“非遗”游湖州:探秘钱山漾遗址
南浔古镇:未被商业化吞噬的江南水乡
南浔古镇vs莫干山:湖州两大景点谁更胜一筹?
冬游湖州:莫干山、南浔古镇、云上草原滑雪场全攻略
探寻儿童青少年心理健康“良方”
两地中学生为何纷纷携手冲过比赛终点?反常之举引发教育界深思
基督教和天主教有区别吗?
龙须菜——一种特殊的海藻植物(营养丰富,药用价值独特)
呛拌龙须豆苗,素食好搭档!减脂的快乐!
岳阳楼景区旅游攻略:门票、交通、景点全攻略
赵本山新作《鹊刀门传奇》幕后揭秘:戏瘾犯了!
2024岳阳楼门票多少钱
赵本山新剧遇冷,《乡爱17》遭吐槽:是时候换编剧了!
灭火缺钱、缺水、缺设备......加州山火“人祸”更多细节被披露
地震中建筑物倒塌的原因和采取的预防措施
虚拟社交网络对人际关系的影响
保护个人隐私:如何安全加密文件夹确保数据不被泄露
社交影响实验:为什么人们容易在群体压力下改变判断?