#include <bits/stdc++.h>
using namespace std;
int n,r[1000];
void SIFT(int r[],int i,int m)
{
int j,temp;
temp=r[i];
j=2*i;
while(j<=m){
if((j<m)&&(r[j]<r[j+1])) j++;//判断左右子树谁大一些
if(temp<r[j]){//如果子树比根大
r[i]=r[j];
i=j,j=2*i;//状态转移到他的子树去;
}
else
break;
}
r[i]=temp;
}
void heapsort(int r[])
{
int i;
int temp;
for(int i=n/2;i>=1;i--)//逻辑结构{
SIFT(r,i,n);//从叶子节点开始建堆;
for(i=n;i>=1;i--){
swap(r[1],r[i]);//将最大的点放到最后面;
SIFT(r,1,i-1);//再次排序将最大的点放到1;
}
}
int main()
{
cin>>n;
for(int i=1;i<n+1;i++)
cin>>r[i];
heapsort(r);
for(int i=1;i<n+1;i++)
cout<<r[i]<<' ';
return 0;
}
一切尽在注释中;
堆排快,是因为它是二叉树;
那么为什么是二叉树为不是三叉树的;
这与e有关,具体自己上网查询;