#include<iostream>
#include<cstdio>
using namespace std;
void swap(int *a,int*b) // 交换值
{
int c;
c=*a;
*a=*b;
*b=c;
}
int main()
{
int a[100],i,j,n;
cin>>n;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=n;i>1;i--) // 做n-1次循环 每次找到一个最大值(本代码是找最大值)
{
j=i/2; // 从最大子节点开始找 每一次比较与左右孩子的大小 保障此节点为最大值
if(i%2==0) // 第一次查找时 节点有可能只有左孩纸 故需要判断
if(a[j]<a[2*j]) swap(a+j,a+2*j);
else
{
if(a[j]<a[2*j] ) swap(a+j,a+2*j);
if(a[j]<a[2*j+1]) swap(a+j,a+2*j+1);
}
for(j--;j>0;j--) // 此后的节点一定有左右孩子 故只需将节点与左右孩子不叫大小
{
if(a[j]<a[2*j] ) swap(a+j,a+2*j);
if(a[j]<a[2*j+1]) swap(a+j,a+2*j+1);
}
swap(a+1,a+i); // 第一个元素与最后一个元素交换
}
for(i=1;i<=n;i++)
printf(" %d",a[i]);
cout<<endl;
return 0;
}
/* 7 3 7 5 1 2 6 4 */
堆排序
最新推荐文章于 2024-09-04 23:05:17 发布
