堆排序
摘要
堆排序和快速排序的复杂度都是nlongn;
代码
#include<bits/stdc++.h>
using namespace std;
int n,h[1000];
void swap(int x,int y){
int k;
k=h[x];
h[x]=h[y];
h[y]=k;
}
void siftdown(int i){//向下调整
int t;
int flag=1;
while(2*i<=n&&flag){
//先与左子树比较
if(h[i]>h[2*i]){
t=2*i;
}
else t=i;
//再与右子树比较
if(2*i+1<=n){
if(h[t]>h[2*i+1])
t=2*i+1;
}
if(t!=i)//有儿子比它小,交换
{
swap(t,i);
i=t;//更换检查的位置
}
else flag=0;//父节点都大于左右儿子 符合,不需调整
}
}
//建立最小堆
void creat(){
int i;
for(i=n/2;i>=1;i--)
{
siftdown(i);
}
}
//删除元素
int delect(){
int t;
t=h[1];//保存最小值
h[1]=h[n];//把最后的元素弄到顶部
n-=1;//节点数量变少
siftdown(1);//从新从顶部往下下调
return t;
}
int main(){
int num,i;
cin>>n;
num=n;
for(i=1;i<=num;i++)
cin>>h[i];
creat();
for(i=1;i<=num;i++)
cout<<delect()<<' ';
cout<<endl;
return 0;
}