#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void AdjustDown(HPDataType* a, int size, int parent)//向下调整(小堆)(非递归)
{
assert(a);
int child = parent * 2 + 1;
while (child < size)//最坏情况下,要一直换到叶子节点
{
//找到较小的孩子
if ((child + 1 < size) && (a[child] > a[child + 1]))//如果右孩子比左孩子小
{
child++;
}
//向下调整
if (a[child] < a[parent])//如果子节点小于父节点,不满足小根堆的性质,交换
{
Swap(&a[child], &a[parent]);
parent = child;//更新父子节点,准备下一次比较
child = parent * 2 + 1;
}
else
{
break;//如果子节点大于父节点,满足小根堆的性质,结束循环
}
}
}
void HeapSort(HPDataType* a, int n)//堆排序(降序)[升序,降序与建的堆是大堆还是小堆有关]
{
for (int i = (n - 1 - 1) / 2; i < n; i++)//建堆(小堆),为排序做准备
{
AdjustDown(a, n, 0);//向下调整,建堆
}
int end = n - 1;//找到最后一个数据
while (end > 0)
{
Swap(&a[0], &a[end]);//交换第一个数据(数值最小的数据)和最后一个数据,完成第一个数据的归位
AdjustDown(a, end, 0);//对前面的数据进行向下调整保持(小堆)结构
end--;//更新end
}
}
排序篇(三)堆排序
最新推荐文章于 2026-08-17 23:30:53 发布
堆排序&spm=1001.2101.3001.5002&articleId=127047048&d=1&t=3&u=66c061f733514eeb9187fa42961083f8)
1433

被折叠的 条评论
为什么被折叠?



