堆排序
掌握大根堆、小根堆、完全二叉树的概念
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a[100];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
cin>>a[i];
int heapsize=n;
for(int i=0;i<n;i++)
{
int index=i;
while(a[index]>a[(index-1)/2])
{
swap(a[index],a[(index-1)/2]);
index=(index-1)/2;
}
}
swap(a[0],a[--heapsize]);
while(heapsize>=1)
{
int index=0;
int left=index*2+1;
while(left<heapsize)
{
int largest=((left+1)<heapsize&&a[left+1]>a[left])?(left+1):left;
largest=(a[largest]>a[index])?largest:index;
if(largest==index)
break;
swap(a[largest],a[index]);
index=largest;
left=index*2+1;
}
swap(a[0],a[--heapsize]);
}
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
return 0;
}