#include <stdio.h>
//堆排序
void AdjustDown(int a[] ,int k,int n)
{
int i;
a[0] = a[k];
for(i=2*k;i<=n;i*=2){ //从最后一个叶子节点和双亲节点比较
if(i<n&&a[i]<a[i+1]) //左右孩子比较谁大
i++;//如果右孩子大,i++
if(a[0]>=a[i])//如果右孩子节点小于双亲节点,跳出循环
break;
else
a[k] = a[i];//如果右孩子节点比双亲节点大,将右孩子节点赋值给双亲节点
k=i;//为了比较右孩子或左孩子的子树
}
a[k] = a[0];//双亲节点赋值给孩子节点,互换值
}
void BuildMaxHeap(int a[],int n)
{
int i;
for(i=n/2;i>0;i--) //i=n/2为最后一个双亲节点
{
AdjustDown(a,i,n);
}
}
void HeapSort(int a[],int n)
{
int i,j;
BuildMaxHeap(a,n);
for(i=n;i>1;i--)
{
j = a[1];
a[1] = a[i];
a[i] = j;//将最后根节点和最后一个叶子节点互换值,也就是把最大值放到数组最后一个位置
AdjustDown(a,1,i-1);//重新排成大根堆,如果将AdjustDown和BuildMaxHeap整合到一起,
//将此换成BuildMaxHeap,此时参数k为i-1/2,但此时i-1/2的子树是大根堆,无需排序,会浪费时间
}
}
int main()
{
int n,i,j;
scanf("%d",&n);
int a[n+1];
for(i=1;i<=n;i++) //a[0]不存数,作为中间变量
{
printf("请输入第%d个值",i);
scanf("%d",&a[i]);
}
HeapSort(a,n);
for(j=1;j<=n;j++)
{
printf("%d ",a[j]);
}
}
堆排序(c语言)
最新推荐文章于 2024-07-19 14:23:56 发布