在该排序过程中,先将全部的数据先输入后在对整体进行调整,当然也可以边输入边调整,这个就需要你自己去实践一下了。
#include <bits/stdc++.h>
using namespace std;
int Size;
void head(int a[], int k)//从第k个位置开始往上进行调整
{
int i, t;
for(i = k; i*2<=Size; ){
if(2*i+1<=Size){ //判断该节点是否有右分支,然后在比较并选出较小者
if(a[i*2+1]<a[i*2]) t = i*2+1;
else t = i*2;
}
else t = i*2;//如果没有右分支就直接选择左分支的节点
if(a[t]<a[i]){//将其与父亲节点进行比较,满足条件时交换值
int s = a[i];
a[i]=a[t];
a[t] = s;
i = t;//交换后将交换后的位置进行标记,以便往下次调整
}
else return;//满足最小堆则返回
}
}
void headsort(int a[], int n)//将整个堆调整成最小堆
{
int i;
for(i = n/2; i>0; i--){
head(a,i);
}
}
int Delete(int a[], int n){将数据逐个弹出
int t = a[1];
a[1] = a[Size];
Size--;
head(a,1);
return t;
}
int main()
{
int a[20], i, n;
cin>>n;
for(i = 1; i<=n; i++){
cin>>a[i];
}
Size = n;
headsort(a,n);
for(i = 0;i<n; i++){
cout<<Delete(a,Size)<<endl;
}
return 0;
}